READ_UNCOMMITED隔離級別應該有髒讀,所以在這種情況下:H2 - READ_UNCOMMITED事務不會讀取另一個事務所做的未被更改的更改,爲什麼?
Thread1 Thread2 (READ_UNCOMMITED)
| |
getAccount(1); |
| |
updateAccount(account1) |
| |
flush() |
| |
| getAccount(1)
| |
commitTx() |commitTx()
|_ |_
Thread2.getAccount(1)
應該看到正在由線程1所做的未提交的更改,不應該嗎?
嗯,我沒有看到,我得到的帳戶baDao.findOne(accountId);
看到原始的DB值,沒有從正在運行的線程1遞增的,可能是什麼解釋?
這是線程1更新帳戶的地方:
@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");
}
我停止線程1在logger.info("Money added");
然後線程2運行:
@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;
}
如果您正在使用V1.4或H2數據庫的更高,使用MVStore(這是默認值),默認的隔離級別是'READ_COMMITTED'和設置數據源或事務上的默認隔離級別[無效果](http://www.h2database.com/html/advanced.html#transaction_isolation)。 – manish