H2 - READ_UNCOMMITED 事务没有读取另一个事务所做的未提交的更改,为什么?
H2 - READ_UNCOMMITED transaction doesn't read uncommited changes made by another transaction, why?
READ_UNCOMMITED 隔离级别应该有脏读,所以在这种情况下:
Thread1 Thread2 (READ_UNCOMMITED)
| |
getAccount(1); |
| |
updateAccount(account1) |
| |
flush() |
| |
| getAccount(1)
| |
commitTx() |commitTx()
|_ |_
Thread2.getAccount(1)
应该会看到 Thread1 所做的未提交更改,不是吗?
好吧,我没看到,我通过 baDao.findOne(accountId);
获得的帐户看到的是原始数据库值,没有来自 运行 线程 1 的递增值,这有什么解释?
这是Thread1更新账号的地方:
@Transactional(isolation=Isolation.READ_UNCOMMITTED)
@Override
public void addMoneyReadUncommited(int accountId, int ammount) {
printIsolationLevel();
BankAccount ba = baDao.findOne(accountId);
ba.setMoney(ba.getMoney()+ammount);
baDao.save(ba);
flushEntityManager();
logger.info("Money added");
}
我在 logger.info("Money added");
处停止 Thread1,然后 Thread2 运行:
@Transactional(readOnly=true, isolation=Isolation.READ_UNCOMMITTED)
@Override
public BankAccount getReadUncommited(int accountId){
printIsolationLevel();
BankAccount account = baDao.findOne(accountId);
logger.info("get({}) -> {}",accountId, account);
return account;
}
问题出在我使用的数据库上。我正在使用 H2 进行测试,由于某些未知原因,第二个线程没有看到未提交的更改。
更改为 MariaDB 后,一切都按预期运行
READ_UNCOMMITED 隔离级别应该有脏读,所以在这种情况下:
Thread1 Thread2 (READ_UNCOMMITED)
| |
getAccount(1); |
| |
updateAccount(account1) |
| |
flush() |
| |
| getAccount(1)
| |
commitTx() |commitTx()
|_ |_
Thread2.getAccount(1)
应该会看到 Thread1 所做的未提交更改,不是吗?
好吧,我没看到,我通过 baDao.findOne(accountId);
获得的帐户看到的是原始数据库值,没有来自 运行 线程 1 的递增值,这有什么解释?
这是Thread1更新账号的地方:
@Transactional(isolation=Isolation.READ_UNCOMMITTED)
@Override
public void addMoneyReadUncommited(int accountId, int ammount) {
printIsolationLevel();
BankAccount ba = baDao.findOne(accountId);
ba.setMoney(ba.getMoney()+ammount);
baDao.save(ba);
flushEntityManager();
logger.info("Money added");
}
我在 logger.info("Money added");
处停止 Thread1,然后 Thread2 运行:
@Transactional(readOnly=true, isolation=Isolation.READ_UNCOMMITTED)
@Override
public BankAccount getReadUncommited(int accountId){
printIsolationLevel();
BankAccount account = baDao.findOne(accountId);
logger.info("get({}) -> {}",accountId, account);
return account;
}
问题出在我使用的数据库上。我正在使用 H2 进行测试,由于某些未知原因,第二个线程没有看到未提交的更改。
更改为 MariaDB 后,一切都按预期运行