Главная » Java, JavaBeans » Управление транзакциями с оптимистичной схемой блокировок

0

Inprise-реализация Контейнера EJB не выполняет блокировок Entity- Компонентов для выполнения транзакций. Это означает, что несколько различных транзакций, выполняемых параллельно в интересах различных клиентов, обращаются к "логически" одному и тому же Entity-объекту, но к различным "физическим" копиям данных. Это может вызвать проблемы при работе с большинством СУБД.

Для примера предположим, что три различные транзакции одновременно обращались к Entity-Компоненту SavingsAccount с целью модификации записи в таблице счетов Account. Если все они пробовали изменить значение одного и того же поля, то одна транзакция могла бы перезаписать результаты, только что подтвержденные другими транзакциями без анализа того, что было сделано. В общем случае это нельзя считать правильным решением. С другой стороны, если изменения вносились в разные поля одной и той же записи, то только одна транзакция была бы завершена успешно, в то время как две другие были бы откачены.

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

Контейнер делает копию состояния Компонента перед выполнением первой операции чтения. Затем, в процессе выполнения нашей транзакции, другие транзакции изменяют его состояние. При завершением нашей транзакции Контейнер определяет, значение каких полей было изменено, и выполняет запись состояния только этих полей. Контейнер позволяет транзакциям успешно завершаться, если они изменяют значения различных полей одной и той же записи. Если же транзакции пытаются одновременно изменить значение одного и того же поля – т.е. транзакции считали одно и то же значение, и одна из них успела подтвердить изменения – Контейнер откатывает вторую транзакцию при попытке ее подтверждения, поскольку данные были изменены и эта вторая транзакция (или "last to commit”-транзакция) не имеет информации о ранее внесенных изменениях.

Источник: Руководство программиста Enterprise JavaBeans

По теме:

  • Комментарии