Как грязное чтение работает в спящем режиме

В соответствии с постоянством Java Мэннинга в Hibernate:

Грязное чтение происходит, если одна транзакция считывает изменения, сделанные другой транзакцией, которая еще не была зафиксирована. Это опасно, потому что изменения, сделанные другой транзакцией, могут впоследствии откатиться, и недопустимые данные могут быть записаны первой транзакцией.

если запись извлекается из базы данных, соответствующий объект был создан в постоянном состоянии, и любые внесенные изменения сначала записываются в постоянный объект, что делает его грязным.

Теперь мой вопрос: если какая-то другая транзакция читает ту же запись, то будет ли она читать запись из постоянного состояния, то есть кеша первого уровня (который в данный момент загрязнен), или получит запись из базы данных.

1 ответ

Кэш первого уровня не распределяется между транзакциями. За исключением случаев расширенного контекста постоянства, наиболее распространенным шаблоном является то, что каждая транзакция связана с одним сеансом / постоянным контекстом и имеет собственный кэш первого уровня, который отслеживается только для этой транзакции.

На самом деле "dirty-read" - это свойство транзакции базы данных, а не Hibernate в целом. Когда одна транзакция читает изменения, сделанные другой транзакцией, которая еще не была зафиксирована, это называется грязным чтением. Опасно и необычно использовать этот тип транзакции, потому что прочитанные данные могут откатываться.

какие бы изменения не были сделаны, они сначала записываются на постоянный объект, следовательно, он становится грязным.

В вышеприведенной строке вы говорите, что в объект были внесены изменения (но изменения еще не отправлены в базу данных, поскольку ORM, как и Hibernate, задерживает сброс sql до конца транзакции). Таким образом, объект после изменения теперь грязный, но этого нельзя сказать о транзакции, поскольку в базу данных не было отправлено никаких вставок / обновлений / удалений. Говоря о Hibernate - причина, по которой он считается "грязным" с точки зрения приложения, состоит в том, что объект представление данных, считываемых hibernate, может быть изменено с помощью установщиков, поэтому объект или данные становятся "грязными", которые должны быть сброшены в базу данных в конце транзакции, иначе приложение может фактически принять решение не фиксировать. Основная задача Hibernate - отслеживать это измененное ("грязное") состояние и в конце транзакции генерировать соответствующую вставку / обновление / удаление. Таким образом, эта грязь является разницей между состоянием, которое изначально прочитано, и состоянием после внесенных изменений, если таковые имеются в рамках одной транзакции.

Другие вопросы по тегам