【发布时间】:2017-02-07 10:54:02
【问题描述】:
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;
}
【问题讨论】:
-
如果您使用的是v1.4或更高版本的H2数据库并使用MVStore(这是默认的),则默认隔离级别为
READ_COMMITTED并在数据源上设置默认隔离级别或交易has no effect。
标签: jpa spring-data spring-data-jpa h2 isolation-level