READ_UNCOMMITED 격리 수준은 읽기 오염을하도록되어이 시나리오에서 그렇게 :H2 - READ_UNCOMMITED 트랜잭션은 다른 트랜잭션이 수행 한 커밋되지 않은 변경 사항을 읽지 않습니다. 이유는 무엇입니까?
Thread1 Thread2 (READ_UNCOMMITED)
| |
getAccount(1); |
| |
updateAccount(account1) |
| |
flush() |
| |
| getAccount(1)
| |
commitTx() |commitTx()
|_ |_
Thread2.getAccount(1)
그것은해야하지, Thread1에 의해 만들어지고있는 미트되지 않은 변경 사항을 확인해야합니까?
글쎄, 나는 그 계정을 가지고 있는데, baDao.findOne(accountId);
은 원래의 DB 값을보고 있는데, 실행중인 스레드 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");
에서 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;
}
를 예상대로 동작, 기본 격리 수준은'READ_COMMITTED'과 설정입니다 데이터 원본 또는 트랜잭션의 기본 격리 수준 [영향 없음] (http://www.h2database.com/html/advanced.html#transaction_isolation) – manish