H2 - READ_UNCOMMITED事务没有读取另一个事务所做的未经修改的更改,为什么?

时间:2016-09-29 08:09:43

标签: jpa spring-data spring-data-jpa h2 isolation-level

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

1 个答案:

答案 0 :(得分:1)

问题是我正在使用的数据库。我正在使用H2测试,由于某些未知原因,第二个线程没有看到未经修改的更改。

更改为MariaDB后,所有内容都按预期运行