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;
}
予想通りMariaDBのすべてのものに変更した後
を使用すると、H2データベースのバージョン1.4以降を使用して(デフォルト)MVStoreを使用している場合は、デフォルトの分離レベルは 'READ_COMMITTED'と設定され振る舞いますデータソースまたはトランザクションのデフォルトの分離レベル[影響はありません](http://www.h2database.com/html/advanced.html#transaction_isolation) – manish