Java 在EJB和Hibernate上下文中理解事务
EJB默认处理事务管理,正如我所读到的,hibernate也处理事务。当我谈到事务时,我理解回滚数据库持久化操作之类的功能Java 在EJB和Hibernate上下文中理解事务,java,hibernate,ejb,Java,Hibernate,Ejb,EJB默认处理事务管理,正如我所读到的,hibernate也处理事务。当我谈到事务时,我理解回滚数据库持久化操作之类的功能 我的问题是,对于同时使用EJB和Hibernate的应用程序,我们如何有选择地选择一个事务提供程序来支持?EJB和hibernate事务也可以同时工作吗?hibernate和EJB事务可以并且确实可以同时工作。默认情况下,当进行EJB调用时,调用将位于可以提交或回滚的EJB事务中。如果您碰巧在EJB调用(或MDB)中进行了hibernate调用,并且该事务被回滚,hiber
我的问题是,对于同时使用EJB和Hibernate的应用程序,我们如何有选择地选择一个事务提供程序来支持?EJB和hibernate事务也可以同时工作吗?hibernate和EJB事务可以并且确实可以同时工作。默认情况下,当进行EJB调用时,调用将位于可以提交或回滚的EJB事务中。如果您碰巧在EJB调用(或MDB)中进行了hibernate调用,并且该事务被回滚,hibernate数据库事务也将回滚。在这种情况下,当您执行事务提交时,hibernate还将提交数据库事务 我的想法是:EJB事务环绕Hibernate数据库事务,数据库事务取决于要提交的EJB事务。如果EJB事务失败,数据库事务也会失败。如果EJB事务提交,那么数据库事务也提交 示例#1-成功交易:
EJB method
|--> Transaction Started
|
|--> Call persist method on Entity Manager instance
|
|--> SQL insert statement added to database transaction
...
|--> EJB Transaction committed
| --> SQL insert statement committed to database
EJB method
|--> Transaction Started
|
|--> Call persist method on Entity Manager instance
|
|--> SQL insert statement added to database transaction
...
X--> EJB Transaction rolls back
X --> Database transaction rolls back (insert not performed)
示例#2-回滚事务:
EJB method
|--> Transaction Started
|
|--> Call persist method on Entity Manager instance
|
|--> SQL insert statement added to database transaction
...
|--> EJB Transaction committed
| --> SQL insert statement committed to database
EJB method
|--> Transaction Started
|
|--> Call persist method on Entity Manager instance
|
|--> SQL insert statement added to database transaction
...
X--> EJB Transaction rolls back
X --> Database transaction rolls back (insert not performed)
此外,如果您嵌套EJB调用(例如,一个EJB方法调用另一个EJB方法),默认情况下,它们都位于同一事务中。因此,整个调用层次结构必须成功完成,才能提交所有EJB和Hibernate调用
示例#3-嵌套EJB事务:
EJB method
|--> Transaction Started
|
|--> Call persist method on Entity Manager instance
|--> SQL insert statement added to database transaction
...
|--> Another EJB method called, *continues* same transaction
|
|--> EJB method successfully commits
...
|--> EJB Transaction committed
| --> SQL insert statement committed to database
示例#4-带回滚的嵌套EJB事务:
EJB method
|--> Transaction Started
|
|--> Call persist method on Entity Manager instance
|
|--> SQL insert statement added to database transaction
...
|--> Another EJB method called, *continues* same transaction
|
X--> EJB method rolls back
...
X--> EJB Transaction rolls back
X --> Database transaction rolled back (insert not performed)
您可以通过自己管理事务来更改此行为,如果您使用的是容器管理的事务,则可以通过使用@TransactionAttribute
s来划分您的方法(即让容器完成繁重的工作)
有很多关于事务和休眠的好信息。有趣的问题,但英语不好-也许母语为英语的人可以帮上大忙。。。