EJB学习笔记之十(BMT事务和CMT事务)
来源:互联网 发布:node实战 编辑:程序博客网 时间:2024/04/30 02:59
1.前言
前两篇博客主要介绍了与事务相关的知识,例如事务的一些特性,以及并发产生的问题。本篇来讲解一下EJB中两种处理事务的方式。一种是以生命式方式来管理事务(CMT);另一种则是在EJB内部使用事务代码自己来管理事务。这种方式称为Bean管理事务(BMT)。
2.容器管理事务(CMT)
容器默认使用的容器管理事务的策略。当使用CMT事务管理策略时,容器将接管EJB的事务管理,为我们完成事务开始、提交或者回滚。容器总是在业务方法的开始、结束处标记事务边界。也就是说,容器将在调用方法之前开始JTA事务,然后根据方法的调用情况来决定提交或者回滚事务。
当使用容器管理事务时,业务方法不应该调用任何可能与容器所设置事务边界冲突的方法,例如
1.禁止调用Connection接口中的commit、rollback等方法
2.禁止调用EJBContext的getUserTransaction方法
3.禁止调用UserTransaction的任何方法
实例讲解
package bmt;import java.sql.Connection;import java.sql.SQLException;import java.sql.Statement;import javax.annotation.Resource;import javax.ejb.SessionContext;import javax.ejb.Stateless;import javax.ejb.TransactionAttribute;import javax.ejb.TransactionAttributeType;import javax.ejb.TransactionManagement;import javax.ejb.TransactionManagementType;import javax.naming.Context;import javax.naming.InitialContext;import javax.naming.NamingException;import javax.sql.DataSource;@Stateless(mappedName="Cmt")@TransactionManagement(TransactionManagementType.CONTAINER)//事务的属性支持,有六大属性值@TransactionAttribute(TransactionAttributeType.REQUIRED)public class CmtBean implements Cmt {private DataSource ds = null;//远程注入数据源@Resourceprivate SessionContext sessCtx;public CmtBean()throws NamingException{Context ctx = new InitialContext();ds = (DataSource)ctx.lookup("javaee");}public void insert(){try{Connection conn = ds.getConnection();Statement stmt = conn.createStatement();int result = stmt.executeUpdate("insert into user_table "+ "values(null, '新用户' , 'bbb')");System.out.println(result);//下面这条语句将引起失败stmt.executeUpdate("insert into user_table "+ "values(1, 'aaa' , 'bbb')");stmt.close();conn.close();}catch (SQLException ex){ex.printStackTrace();sessCtx.setRollbackOnly();}}}使用的时候只需要在方法或者类上使用注解即可,类上的注解将会覆盖方法上的注解。
2.Bean管理事务(BMT)
CMT的最大优点是简单、方便,但它不够灵活。总是在业务方法的开始、结束处标记事务边界,依靠容器来决定何时开始、提交或者回滚。与CMT相对的是,BMT事务管理可以由开发者来决定业务方法中的事务边界。
package bmt;import java.sql.Connection;import java.util.*;import javax.ejb.*;import javax.annotation.*;import javax.naming.*;import java.sql.*;import javax.sql.*;import javax.transaction.*;@Stateless(mappedName="Bmt")@TransactionManagement(TransactionManagementType.BEAN)public class BMTBean implements Bmt {private DataSource ds=null;@Resourceprivate UserTransaction tx;public BMTBean() throws Exception{Context ctx=new InitialContext();ds=(DataSource)ctx.lookup("javaee");}public void insert() throws Exception {try{//开始事务tx.begin();Connection conn = ds.getConnection();Statement stmt = conn.createStatement();int result = stmt.executeUpdate("insert into user_table "+ "values(null, 'BMT插入的记录' , 'bbb')");System.out.println(result);//下面这条语句将引起失败stmt.executeUpdate("insert into user_table "+ "values(1, 'aaa' , 'bbb')");//提交事务tx.commit();stmt.close();conn.close();}catch (SQLException ex){ex.printStackTrace();//回滚事务tx.rollback();}}}BMT事务管理主要就是依赖于UserTransaction,也是JTA中最常用的一个API,包含的方法与JDBC事务类似。
3.小结
通常来说,EJB容器建议使用CMT管理事务,因此CMT也是默认的事务管理类型。而相对于CMT,BMT比较的灵活,可以自己采用编码的方式来管理事务,自己确定事务的边界。两种事务的使用,需要根据自身业务的需要来确定。
1 0
- EJB学习笔记之十(BMT事务和CMT事务)
- EJB之BMT事务和CMT事务
- 全面分析EJB编程式事务管理(bmt)和声明式事务管理(cmt)(一)——事务基本概念
- 事务—EJB事务(BMT)
- EJB 3事务之:容器管理事务(CMT)
- EJB 3事务之容器管理事务(CMT)
- EJB 3事务之容器管理事务(CMT)
- 事务—EJB事务(CMT)
- 全面分析EJB编程式事务管理(bmt)和声明式事务管理(cmt)(二)——声明式事务
- 关于ejb中的BMT和CMT
- EJB 3事务之容器管理事务(CMT)BEAN管理事务
- EJB 3事务之容器管理事务(CMT)BE…
- EJB学习笔记之八(通俗易懂数据库中的事务)
- BMT(Bean管理事务)
- 全面分析EJB编程式事务管理(bmt)和声明式事务管理(cmt)(四)——参考网址
- EJB学习笔记之九(实例详解EJB事务中的六大传播特性)
- CMT(容器管理事务)
- 全面分析EJB编程式事务管理(bmt)和声明式事务管理(cmt)(三)——编程式事务管理
- dos命令之find
- [日志分析]在nginx日志中,提取有效的request uri
- 【Win10】联想Z50-70升级到Win10,声音变成环绕声解决办法
- 织梦5.7DEDECMS标签大全
- 矩阵优化的模板(用的时候注意要修改呀)
- EJB学习笔记之十(BMT事务和CMT事务)
- jQuery FlexSlider插件的详细设置参数
- Unity3d实现画笔
- centos7 下安装Apache2+MariaDB+PHP5过程详解
- Qt中使用html语言对word进行图表操作
- poj 3280 字符串上的动态规划
- tablview性能优化&instrument详解
- 获得手势所在的图片坐标 & CGRectContainsPoint
- 面试30 求数组中最小的k个数