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

Согласно Manning's Java Persistence with Hibernate:

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

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

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


person jayendra bhatt    schedule 19.11.2014    source источник


Ответы (1)


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

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

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

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

person Shailendra    schedule 20.11.2014
comment
Таким образом, вы имеете в виду, что грязное чтение происходит, если мы пытаемся получить ту же запись (т.е. с тем же идентификатором) в одной и той же транзакции. - person jayendra bhatt; 20.11.2014