Exceptions and Transactions
异常对事务的结果有很大的影响。
Application Exceptions Versus System Exceptions
系统异常代表未知的内部错误。当应用服务器发生内部错误时,EJB容器就会抛出系统异常。如
果希望终止业务流程的执行,业务逻辑也是可以抛出系统异常的。应用异常通常是业务逻辑的一
部分。他们代表了经过强类型定义之后的业务领域的特定问题或错误,这些问题或错误是不需要
终止或回滚的业务流程的。
系统异常
系统异常包括java.lang.RuntimeException及其子类(EJBException是RuntimeException的一个
子类)和java.rmi.RemoteException及其子类。RuntimeException子类和RemoteException子类
的区别在于,前者可藉由@java.ejb.ApplicationException注解转化为应用异常。
不标注@ApplicationException的RuntimeException都将由容器自动从方法中抛出,并引起事务
回滚。所以我们无需抛出也无需捕获。
容器在自动处理系统异常时,通常会做如下几件事情:
1.回滚事务
2.将异常记录到日志中,以警示系统管理员
3.丢弃EJB实例
丢弃EJB实例对SLSB影响不大,对SFSB影响非常严重。
作为经验法则,请将非业务子系统的异常(比如JDBC抛出的SQLException,或者JMS抛出
JMSException)作为EJBException(或者是可以引起回滚的@ApplicationException异常)重新
抛出,并允许EJB容器自动回滚事务,将bean实例丢弃。
应用异常
我们可以使用@java.ejb.ApplicationException注解来强制要求应用异常自动回滚事务:
此注解同样也可用于RuntimeException和RemoteException的子类。这一点非常有价值,因为你
可能并不希望将抛出的RuntimeException包装成EJBException,或者不希望某个
RemoteException的子类回滚事务。