#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 все ведет себя так, как ожидалось