2016-09-29 12 views
0

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

를 예상대로 동작, 기본 격리 수준은'READ_COMMITTED'과 설정입니다 데이터 원본 또는 트랜잭션의 기본 격리 수준 [영향 없음] (http://www.h2database.com/html/advanced.html#transaction_isolation) – manish

답변

0

문제는 내가 사용 된 데이터베이스가

이것은 Thread1 계정을 업데이트하는 곳입니다 . 나는 H2로 테스트를하고 있었고 어떤 알려지지 않은 이유로 두 번째 스레드가 커밋되지 않은 변경 사항을 보지 못했다.

MariaDB의 모든 것을 변경 한 후 V1.4 또는 H2 데이터베이스의 이상을 사용하고 (인 기본값) MVStore를 사용하는 경우

+1

이것은 h2의 알려진 문제점 : https://github.com/h2database/h2database/issues/216 – bedrin