Как правило, он сохраняется в базе данных, когда ваша транзакция совершается.
С CMP вы можете управлять этим с помощью демаркации транзакции в дескрипторе депозита a'la
<ejb-jar>
...
<assembly-descriptor>
...
<container-transaction>
<method>
<ejb-name>EmployeeRecord</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
<container-transaction>
<method>
<ejb-name>EmployeeRecord</ejb-name>
<method-name>updatePhoneNumber</method-name>
</method>
<trans-attribute>Mandatory</trans-attribute>
</container-transaction>
...
Это фрагмент из спецификации http://download.oracle.com/otn-pub/jcp/ejb-2.1-fr-spec-oth-JSpec/ejb-2_1-fr-spec.pdf
Когда вы вызываетеметод в ejb, новая транзакция может быть инициирована контейнером, в зависимости от вашего разграничения, и если метод завершается успешно, транзакция может быть зафиксирована, в зависимости от того-то и того-то.Например, если ваш конкретный метод был разграничен с помощью require-new, он будет зафиксирован, потому что он имеет свою собственную транзакцию, но если он разграничен с помощью require и был вызван в любой выполняющейся транзакции (например,поскольку он был вызван из метода сессионного компонента, разграниченного, скажем, с помощью require или require-new), он будет зафиксирован, когда будет завершена эта включающая транзакция.Или, если это не удастся, будет выполнен откат не только изменений, внесенных внутри этого метода, но и изменений, внесенных в вызов / транзакцию включающего метода.
Хотя дескриптор развертывания может разрешать вложенные транзакции, он фактически сводится к следующемукак механизм базы данных обрабатывает транзакции в конце.Очень часто rdbms на самом деле не поддерживает вложенные транзакции, а вместо этого использует точки сохранения транзакций, поэтому то, что кажется рекурсивным с точки зрения ejb, может фактически происходить в базе данных «линейно».В большинстве случаев результат одинаков.
Также может быть уместно рассмотреть уровень изоляции транзакции.