Управление транзакциями с помощью Spring, Hibernate и mySQL - PullRequest
3 голосов
/ 13 апреля 2011

Я работаю над веб-приложением со Spring Framework 3 и Hibernate 3.6, и я пытаюсь понять, как работает управление транзакциями. Я использую MySQL Server 5.1 с таблицами InnoDB. Я написал свой DAO на основе простого API Hibernate 3.

1) Правильно ли, что MySQL Server сам определяет, как обрабатываются транзакции? Это означает, что он решает, когда записи должны быть заблокированы или нет?

2) Когда я объявляю метод весной как @transactional (readOnly = true) или @transactional (readOnly = false), это влияет, если записи данных заблокированы во время транзакции? Это означает, что когда readOnly = true, ни одна строка данных не заблокирована, а когда readOnly = false, все используемые записи данных заблокированы?

3) Что происходит, когда я получил readOnly = true и я читаю различные записи данных. Предположим, что в середине чтения они изменяются другой транзакцией, так что я получаю несколько старых записей и несколько новых записей. Это возможно?

4) Когда происходит коммит? После успешной транзакции или когда сессия закрыта?

5) когда начинается Hibernate-сеанс? для каждого сеанса (между сервером и клиентом) или для каждой транзакции?

6) В конце концов, кто несет ответственность за управление транзакциями? весна или mysql или оба?

Спасибо, что ответили! : -)

1 Ответ

5 голосов
/ 13 апреля 2011

1) Правильно ли, что MySQL Server сам определяет, как обрабатываются транзакции?Это означает, что он решает, когда записи должны быть заблокированы или нет?

По сути - да, реализация транзакций является обязанностью СУБД

2), 3)...

readOnly не имеет ничего общего с транзакциями, это подсказка для Hibernate, которая говорит, что Hibernate не должен распространять изменения, внесенные в загруженный объект, в базу данных (то есть вы можете указать его какподсказка производительности, если ваша транзакция не предназначена для записи изменений в базу данных)

4) Когда происходит фиксация?После успешной транзакции или закрытия сеанса?

Подтверждение - это действие, которое завершает транзакцию (еще одно такое действие - откат), поэтому оно происходит в конце транзакции.

5) когда начинается Hibernate-сессия?для каждого сеанса (между сервером и клиентом) или для каждой транзакции?

По умолчанию - для каждой транзакции, если не настроена поддержка Open Session in View.

6)в конце концов, кто несет ответственность за управление транзакциями?Spring или MySQL или оба?

База данных обеспечивает реализацию транзакционного поведения.Spring управляет транзакциями путем определения их границ и запуска фиксации / отката.

...