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

#jpa #spring-data #spring-data-jpa #h2 #isolation-level

#jpa #spring-данные #spring-data-jpa #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, какое может быть объяснение?

Это место, где 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. Если вы используете версию v1.4 или выше базы данных H2 и используете MVStore (который используется по умолчанию), уровень изоляции по умолчанию READ_COMMITTED равен и установка уровня изоляции по умолчанию для источника данных или транзакции не имеет никакого эффекта .

Ответ №1:

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

После изменения на MariaDB все ведет себя так, как ожидалось