H2-READ_UNCOMMITED transaction не читает незафиксированные изменения, сделанные другой транзакцией, почему?

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

Я останавливаю Thread1 наlogger.info("Money added");, а затем 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 ответ

  1. Проблема в базе данных, которую я использовал. Я тестировал с H2 и по какой-то неизвестной причине второй поток не видит незафиксированных изменений.

    После перехода на MariaDB все будет так, как ожидалось