EJB学习笔记之十(BMT事务和CMT事务)
2015-08-01 10:44
330 查看
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;
//远程注入数据源
@Resource
private 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;
@Resource
private 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比较的灵活,可以自己采用编码的方式来管理事务,自己确定事务的边界。两种事务的使用,需要根据自身业务的需要来确定。
相关文章推荐
- uva - 673
- --hdu 1151 - > 双向路径搜索解决覆盖问题
- 分析点
- css 8.1
- hdu 1151 Air Raid(最小路径覆盖)
- hibernate缓存机制
- 新媒体“4U”理论
- Android开发中 ic_launcher 尺寸
- linux 遍历打印目录树
- 3 IoC容器的依赖注入(1)
- Pixhawk---基于NSH的Firmware开发与调试
- hdu 1151 - > 双向路径搜索解决覆盖问题
- 面向对象,类的继承
- 盘点那些年,被Oracle收购的公司
- 浏览器工作原理
- 盘点那些年,被Oracle收购的公司
- 手动刷新magento的索引管理方法
- 设计模式(16) - 状态模式
- 中国开源镜像站
- UVA107等比数列注意特判