Управление транзакциями — важная задача для предприятий. Оно позволяет приложениям иметь согласованные данные и обрабатывать их надежным образом. Управление транзакциями осуществляется на низком уровне, разработчик бизнес-логики не должен заниматься этим. EJB предоставляет довольно простые службы для реализации этой особенности: можно делать это либо программно с высоким уровнем абстракции, либо декларативно, используя метаданные. С момента выхода Java EE 7 Managed Beans также имеет место подобный декларативный механизм.
Большая часть работы корпоративных приложений заключается в управлении данными: их хранении (как правило, в базе данных), получении, обработке и т. д. Часто это делается одновременно, несколько приложений пытаются получить доступ к одним и тем же данным. База данных имеет низкоуровневые механизмы сохранения параллельного доступа, такие как пессимистичные блокировки, и использует механизм транзакций для обеспечения сохранности данных. EJB также пользуется этими механизмами.
Я посвящаю первую часть этой главы описанию управления транзакциями в целом. Далее мы обсудим различные типы разграничения транзакций, поддерживаемых EJB: СМТ и BTM. Закончится эта глава рассмотрением нового перехватчика транзакций, который может быть использован в Managed Beans.
Понимание транзакций
Данные имеют решающее значение для бизнеса, и они должны быть точными независимо от операций, которые вы выполняете, а также от количества приложений, одновременно получающих доступ к данным. Транзакция используется для обеспечения того, что данные хранятся в устойчивом состоянии. Она представляет собой логическую группу операций, которые должны быть выполнены в виде единого блока, также известную как единица работы. Эти операции могут включать сохранение данных в одну или несколько баз данных, отправку сообщений в MOM (промежуточное ПО, ориентированное на обработку сообщений) или вызов веб-служб. Компании полагаются на операции каждый день, работая с приложениями банкинга и электронной коммерции либо взаимодействуя с бизнесом партнеров.
Эти неделимые бизнес-операции выполняются либо последовательно, либо параллельно в течение относительно короткого промежутка времени. Каждая операция должна быть завершена успешно для того, чтобы вся транзакция была завершена успешно (мы говорим, что транзакция зафиксирована). Если одна из операций не выполняется успешно, то происходит сбой транзакции (это называется
Правила ACID
ACID — это аббревиатура, которая формируется из первых букв четырех основных свойств, определяющих надежность транзакций: атомарность (Atomicity), согласованность (Consistency), изолированность (Isolation) и надежность (Durability) (они описаны в табл. 9.1). Для того чтобы объяснить эти свойства, я воспользуюсь классическим примером банковского перевода: нужно снять сбережения с резервного счета, чтобы пополнить основной.
Свойство | Описание |
---|---|
Атомарность | Транзакция состоит из одной или нескольких операций, сгруппированных в единицу работы. По завершении транзакции либо все операции выполняются успешно (фиксация), либо ни одна из них (откат) — в том случае, если произошло что-то неожиданное |
Согласованность | По завершении транзакции данные остаются согласованными |
Изолированность | Промежуточное состояние транзакции не демонстрируется внешним приложениям |
Надежность | После того как транзакция успешно завершается, изменения должны стать видимыми другим приложениям |