二、EJB中事务处理的两种方式
在EJB中处理事务有两种方式,一种是由容器管理事务,一种是由Bean管理事务,
在任何Bean中都可以使用容器管理事务,会话Bean和消息驱动Bean可以使用Bean管理事务,实体Bean不能使使用Bean管理事务。
(一)、容器管理事务
容器管理事务简化了开发,因为企业Bean不用编码来显式制定事务界限。代码不包括开始结束事务的语句。典型的,容器会在一个企业Bean的方法被调用前立即开始一个事务,在这个方法退出以前提交这个事务。每个方法都关联一个事务。在一个方法中不允许嵌套或多个的事务存在。容器管理事务不需要所有的方法都关联事务。当部署一个Bean时,通过设定部署描述符中的事务属性来决定方法是否关联事务和如何关联事务
1、 事务的属性
一个事务的属性控制了事务的使用范围。图 1-1说明了为什么控制事务的范围很重要。图中,method-A开始一个事务然后调用Bean-2中的method-B.它运行在method-A开始的事务中还是重新执行一个新的事务?结果要看method-B中的事务属性
图 1-1
一个事务属性可能有下面的属性之一:
Required
RequiresNew
Mandatory
NotSupported
Supports
Never
Required
如果客户端正在一个运行的事务中调用一个企业Bean的方法,这个方法就在这个客户端的事务中执行。如果客户端不关联一个事务,这个容器在运行该方法前开始一个新的事务。
?Required属性在许多事务环境中可以很好的工作,因此你可以把它作为一个默认值,至少可以在早期开发中使用。因为事务的属性是在部署描述符中声明的,在以后的任何时候修改它们都很容易。
RequiresNew
??如果客户端在一个运行的事务中调用企业Bean的方法,容器的步骤是:
??1.挂起客户端的事务
??2.开始一个新的事务
??3.代理方法的调用
??4.方法完成后重新开始客户端的事务
如果客户端不关联一个事务,容器运行这个方法以前同样开始一个新的事务。如果你想保证该方法在任何时候都在一个新事物中运行,使用RequiresNew属性。
Mandatory
如果客户端在一个运行的事务中调用企业Bean的方法,这个方法就在客户端的事务中执行。如果客户端不关联事务,容器就抛出TransactionRequiredException 异常。
如果企业Bean的方法必须使用客户端的事务,那么就使用Mandatory属性。
NotSupported
如果客户端在一个运行的事务中调用企业Bean的方法,这个容器在调用该方法以前挂起客户端事务。方法执行完后,容器重新开始客户端的事务。
如果客户端不关联事务,容器在方法运行以前不会开始一个新的事务。为不需要事务的方法使用NotSupported属性。因为事务包括整个过程,这个属性可以提高性能。
Supports
如果客户端在一个运行的事务中调用企业Bean的方法,这个方法在客户端的事务中执行,如果这个客户端不关联一个事务,容器运行该方法前也不会开始一个新的事务。因为该属性使方法的事务行为不确定,你应该谨慎使用Supports属性。
Never
??如果客户端在一个运行的事务中调用企业Bean的方法,容器将抛出RemoteException异常。如果这个客户端不关联一个事务,容器运行该方法以前不会开始一个新的事务。
EJB事务范围控制
事务属性
Required(默认)
一定有事务:原有,加入;原无,自创。
RequiresNew
总是创佳新事务。
Supports
和调用者一致:原有,加入;原无,它无。
Mandatory
原有,加入;原无,报错。
NotSupported
原有,挂起原事务,执行;完成后,恢复原事务。
Never
原有,报错;原无,正常运行。