2016-09-29 46 views
0

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; 
} 
+1

如果您正在使用V1.4或H2數據庫的更高,使用MVStore(這是默認值),默認的隔離級別是'READ_COMMITTED'和設置數據源或事務上的默認隔離級別[無效果](http://www.h2database.com/html/advanced.html#transaction_isolation)。 – manish

回答

0

的問題是我用的數據庫。我正在用H2進行測試,並且由於某些未知原因,第二個線程沒有看到未被改動的更改。

切換到MariaDB的一切之後的行爲與預期

+1

這是h2中的一個已知問題:https://github.com/h2database/h2database/issues/216 – bedrin

相關問題