READ_UNCOMMITED隔离级别应该具有脏读,因此在这种情况下:
Thread1 Thread2 (READ_UNCOMMITED)
| |
getAccount(1); |
| |
updateAccount(account1) |
| |
flush() |
| |
| getAccount(1)
| |
commitTx() |commitTx()
|_ |_
Thread2.getAccount(1)
应该看到Thread1正在进行的未经修改的更改,不应该吗?
好吧,我没有看到,我用baDao.findOne(accountId);
获得的帐户看到了原始的DB值,没有从正在运行的线程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;
}
答案 0 :(得分:1)
问题是我正在使用的数据库。我正在使用H2测试,由于某些未知原因,第二个线程没有看到未经修改的更改。
更改为MariaDB后,所有内容都按预期运行