JavaEE中的事务
2016-02-04 13:00
477 查看
事务是一系列操作,这些操作必须同时执行生效或同时取消执行。事务中的所有操作都执行生效称为事务的提交,事务中的所有操作都取消执行称为事务的回滚。一个事务的结束只有提交或回滚两种情况。事务具有ACID四特性。
JavaEE提供了如下两种对事务的管理机制:
容器管理的事务CMT
Bean管理的事务(也称为应用管理的事务)BMT
1. CMT
CMT是声明式事务,对应用代码没有侵入性。如果一个EJB被声明为CMT,则由EJB容器负责该EJB的事务管理,即事务的特性对于EJB是透明的,EJB类中没有任何事务相关的代码。
对于CMT的EJB,对EJB的一个业务方法的执行就对应一个事务。执行进入到EJB业务方法时就立刻开始一个事务,当EJB业务方法执行完毕时自动提交或回滚事务。
CMT不支持嵌套事务或多事务,即在执行一个EJB业务方法时,不可能同时有两个或以上的事务执行,执行的事务中也不能再包含其他事务。但是,可以暂停一个事务,然后执行另一个事务,等第二个事务执行完毕后再执行第一个事务。
1)事务的声明
在CMT的JEB中,并非EJB的所有业务方法都支持事务,这决定于EJB中声明事务的方式。JavaEE提供了@javax.ejb.TransactionAttribute标注用以声明事务。如果该标注作用于EJB类,则整个EJB类中的业务方法都支持事务。该标注还可以只作用于EJB类中的某些业务方法,则使用该标注的业务方法才支持事务,在事务中执行;而没有使用该标注的业务方法不会在事务中执行。
@javax.ejb.TransactionAttribute标注在声明事务的时候,可以带一个javax.ejb.TransactionAttributeType类型的枚举参数如下,具体规定了业务方法执行过程中的事务:
javax.ejb.TransactionAttributeType.RequiresNew
javax.ejb.TransactionAttributeType.Mandatory
javax.ejb.TransactionAttributeType.Never
javax.ejb.TransactionAttributeType.NotSupported
javax.ejb.TransactionAttributeType.Supports
EJB类的事务声明示例如下:
2)事务的回滚
CMT事务回滚有如下2种情况:
EJB业务方法执行过程中发生了系统异常
EJB业务方法主动调用了
3)CMT事务对EJB业务方法的限制
采用CMT的EJB业务方法绝不能含有如下与事务相关的语句:
2. BMT
CMT虽然便于编程实现,但是事务中的逻辑也比较简单,而且不支持嵌套事务。BMT可以实现复杂的事务相关的逻辑。
BMT也称为应用管理的事务,可以分为如下2类:
JDBC事务
JTA事务
JDBC事务不在JavaEE事务管理器的控制下,所以可以在一个JavaEE事务中操作多个JDBC事务。
JTA为应用对事务的访问提供了与事务的具体实现无关的形式,即事务的实现与事务的访问分离。
JTA在JavaEE事务管理器与参与事务的应用之间定义了标准Java访问接口。JTA事务涉及如下3个角色:
JTA事务受JavaEE事务管理器的控制,JTA事务虽然可以支持对多种不同资源(如数据库)的访问,但是也不支持嵌套事务。
BMT的事务必须有始有终。在应用的事务方法中只能通过javax.transaction.UserTransaction接口中的
采用BMT的EJB业务方法中,绝不能调用
JavaEE提供了如下两种对事务的管理机制:
容器管理的事务CMT
Bean管理的事务(也称为应用管理的事务)BMT
1. CMT
CMT是声明式事务,对应用代码没有侵入性。如果一个EJB被声明为CMT,则由EJB容器负责该EJB的事务管理,即事务的特性对于EJB是透明的,EJB类中没有任何事务相关的代码。
对于CMT的EJB,对EJB的一个业务方法的执行就对应一个事务。执行进入到EJB业务方法时就立刻开始一个事务,当EJB业务方法执行完毕时自动提交或回滚事务。
CMT不支持嵌套事务或多事务,即在执行一个EJB业务方法时,不可能同时有两个或以上的事务执行,执行的事务中也不能再包含其他事务。但是,可以暂停一个事务,然后执行另一个事务,等第二个事务执行完毕后再执行第一个事务。
1)事务的声明
在CMT的JEB中,并非EJB的所有业务方法都支持事务,这决定于EJB中声明事务的方式。JavaEE提供了@javax.ejb.TransactionAttribute标注用以声明事务。如果该标注作用于EJB类,则整个EJB类中的业务方法都支持事务。该标注还可以只作用于EJB类中的某些业务方法,则使用该标注的业务方法才支持事务,在事务中执行;而没有使用该标注的业务方法不会在事务中执行。
@javax.ejb.TransactionAttribute标注在声明事务的时候,可以带一个javax.ejb.TransactionAttributeType类型的枚举参数如下,具体规定了业务方法执行过程中的事务:
javax.ejb.TransactionAttributeType.Required
(默认)
如果调用业务方法前已经处于事务中,则将该业务方法的执行加入到当前事务;
如果调用业务方法前未处于事务中,则创建事务,并将该业务方法的执行加入事务
javax.ejb.TransactionAttributeType.RequiresNew
如果调用业务方法前已经处于事务中,则挂起当前事务,创建新事务并将该业务方法的执行加入新事务;该业务方法执行完毕新事务结束,再恢复被挂起的事务
如果调用业务方法前未处于事务中,则创建事务,并将该业务方法的执行加入事务
javax.ejb.TransactionAttributeType.Mandatory
如果调用业务方法前已经处于事务中,则将该业务方法的执行加入当前事务;
如果调用业务方法前未处于事务中,则
EJB container
抛出TransactionRequiredException
javax.ejb.TransactionAttributeType.Never
如果调用业务方法前已经处于事务中,则
EJB container
抛出RemoteException
如果调用业务方法前未处于事务中,则继续在事务之外执行该业务方法
javax.ejb.TransactionAttributeType.NotSupported
如果调用业务方法前已经处于事务中,则挂起当前事务,在事务之外执行该业务方法,该业务方法执行完毕后,再恢复被挂起的事务
如果调用业务方法前未处于事务中,则继续在事务之外执行该业务方法
javax.ejb.TransactionAttributeType.Supports
如果调用业务方法前已经处于事务中,则在事务之中执行该业务方法
如果调用业务方法前未处于事务中,则继续在事务之外执行该业务方法
EJB类的事务声明示例如下:
@javax.ejb.TransactionAttribute(javax.ejb.TransactionAttributeType.NOT_SUPPORTED) @Stateful public class TransactionBean implements Transaction { ... @ javax.ejb.TransactionAttribute(javax.ejb.TransactionAttributeType.REQUIRES_NEW) public void firstMethod() {...}
2)事务的回滚
CMT事务回滚有如下2种情况:
EJB业务方法执行过程中发生了系统异常
EJB业务方法主动调用了
javax.ejb.EJBContext接口的
setRollbackOnly()方法
3)CMT事务对EJB业务方法的限制
采用CMT的EJB业务方法绝不能含有如下与事务相关的语句:
javax.transaction.UserTransaction接口中的任何方法
java.sql.Connection中的commit(), setAutoCommit(),
rollback()方法
javax.jms.Session中的commit(),
rollback()方法
javax.ejb.EJBContext中的getUserTransaction()方法
2. BMT
CMT虽然便于编程实现,但是事务中的逻辑也比较简单,而且不支持嵌套事务。BMT可以实现复杂的事务相关的逻辑。
BMT也称为应用管理的事务,可以分为如下2类:
JDBC事务
JTA事务
JDBC事务不在JavaEE事务管理器的控制下,所以可以在一个JavaEE事务中操作多个JDBC事务。
JTA为应用对事务的访问提供了与事务的具体实现无关的形式,即事务的实现与事务的访问分离。
JTA在JavaEE事务管理器与参与事务的应用之间定义了标准Java访问接口。JTA事务涉及如下3个角色:
应用,业务方法中调用javax.transaction.UserTransaction接口中的,begin(), [code]commit()
rollback()方法[/code]
JavaEE服务器,在应用与事务管理器之间通信
JavaEE事务管理器,控制应用对资源的访问(通过与资源管理器的交互)
JTA事务受JavaEE事务管理器的控制,JTA事务虽然可以支持对多种不同资源(如数据库)的访问,但是也不支持嵌套事务。
BMT的事务必须有始有终。在应用的事务方法中只能通过javax.transaction.UserTransaction接口中的
begin()方法开设一个事务。结束BMT事务则可以分为不同的情况。对于无状态Session Bean,其事务方法必须在返回前调用javax.transaction.UserTransaction接口中的commit()或rollback()方法。对于有状态Session Bean,如果是JDBC事务,则只要JDBC连接存在就一直运行在事务中,直至JDBC连接关闭;如果是JTA事务,则直至调用javax.transaction.UserTransaction接口中的commit()或rollback()方法,事务才会关闭,与期间的JDBC连接是否关闭无关。
采用BMT的EJB业务方法中,绝不能调用
javax.ejb.EJBContext接口的
getRollbackOnly()或
setRollbackOnly()方法。
相关文章推荐
- 设计模式(3)--适配器模式
- Java [Leetcode 111]Minimum Depth of Binary Tree
- Spring对hibernate的事物管理
- java注解的学习
- Scala学习笔记-1用Eclipse和IDEA搭建Scala+Spark开发环境
- springmvc @ResponseBody 乱码
- 测试产生Java内存异常
- 2016蓝桥杯假期任务之《大小写转换》
- 使用Spring JMS收发消息
- i++和++i是否为原子操作
- [Spring实战系列](9)装配集合
- 整合之道--Spring4整合Hibernate5
- Eclipse SVN 插件 subclipse 安装使用。
- Java 读取多个文件流合并操作
- java Map集合框架之LinkedHashMap
- JAVA反射汇总和示例
- sqoop import ERROR sqoop.Sqoop: Got exception running Sqoop: java.lang.RuntimeExceptrion
- Struts2 文件下载(Stream)
- Spring 面试
- 深入分析Java的序列化与反序列化