Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Hibernate, JDBC - блокировка записи


Автор: lunix 18.7.2007, 12:22
При изучении хибернейта у меня возник вопрос.

Хибернейт делает обновление в базу данных в конце транзакции, чтобы избежать блокировки? 

Рассмотрим работу с JDBC. Уровени изоляции транзакций read-commited.

1) Устанавливаем auto commit = false.

2) Начинаем транзакцию

3) Делаем обновление записи базы данных.

Вопрос: устанавливается ли на запись блокировка до конца текущей транзакции?(тогда другие траназакции, использующие данную запись будут блокированы).

Или вообще блокировка не устанавливается, а просто сохраняется измененная запись данной строчки(не в базу) до завершения транзакции, а другие транзакции не блокируются и видят старую запись?


Автор: AntonSaburov 18.7.2007, 12:38
Это может зависеть от базы данных. Например IntarBase или Orcale - версионные и они не блокируют запись. А тот же MS SQL - блокирует.

Автор: lunix 18.7.2007, 13:01
Почитал Тома Кайта(гуру оракла):
в оракле осуществляется блокировка на запись, а другие транзакции при чтении берут данные из сегмента отката.

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

Автор: ekr 18.7.2007, 22:50
Цитата(lunix @  18.7.2007,  12:22 Найти цитируемый пост)
Вопрос: устанавливается ли на запись блокировка до конца текущей транзакции?(тогда другие траназакции, использующие данную запись будут блокированы).

Как сказали AntonSaburov и lunix, поведение очень сильно зависит от выбранного вендора БД.
От себя добавлю, что поведение так же сильно зависит от выбранного уровня изоляции транзакций, причем реализация этих уровней так же vendor-dependent )))

Так что надо знать общие идеи изоляции транзакций, а дальше уже читать доки по конкретному ерверу конкретной версии )

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)