2016-09-29 7 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"); 
} 

私はlogger.info("Money added");でスレッド1を停止してからスレッド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

予想通りMariaDBのすべてのものに変更した後

を使用すると、H2データベースのバージョン1.4以降を使用して(デフォルト)MVStoreを使用している場合は、デフォルトの分離レベルは 'READ_COMMITTED'と設定され振る舞いますデータソースまたはトランザクションのデフォルトの分離レベル[影響はありません](http://www.h2database.com/html/advanced.html#transaction_isolation) – manish

答えて

0

問題は、私が使用したデータベースです。私はH2でテストしていましたが、いくつかの未知の理由により、2番目のスレッドはコミットされていない変更を認識しませんでした。

+1

これはh2の既知の問題です:https://github.com/h2database/h2database/issues/216 – bedrin

関連する問題