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比較的灵活。能够自己採用编码的方式来管理事务,自己确定事务的边界。两种事务的使用,须要依据自身业务的须要来确定。

最新文章

  1. xss篇-本着就了解安全本质的想法,尽可能的用通俗易懂的语言去解释安全漏洞问题
  2. C#控制台项目更改运行文件
  3. Android 程序中得到root activity的引用
  4. bzoj3529(莫比乌斯反演+离线+树状数组)
  5. Office 365 Certificate Exam Resources
  6. java编写二叉树以及前序遍历、中序遍历和后序遍历 .
  7. 【转】第一个MiniGUI程序:模仿QQ界面
  8. 1503171912-ny-一道水题
  9. 一步一步学Vue(三)
  10. 【转】shell字符串截取
  11. vue项目中vux的使用
  12. Web开发——jQuery进阶
  13. Oracle的问题的解决
  14. 什么是DDoS攻击?DDoS防御的11种方针详解
  15. Ubuntu:14.04.2 安装多个Linux内核
  16. Java ENUM枚举的用法
  17. Unity 发布到ios平台笔记
  18. shell学习笔记之变量(一)
  19. ACM-ICPC 2018 焦作赛区网络预赛 E. Jiu Yuan Wants to Eat (树链剖分-线性变换线段树)
  20. 单源最短路dijkstra算法&&优化史

热门文章

  1. BZOJ 1800
  2. Delphi指针详解
  3. 《Java编程思想》笔记 第五章 初始化与清理
  4. ros中删除某个包之后用apt安装的包找不到
  5. mysql查看每张表的空间使用情况
  6. [libgdx游戏开发教程]使用Libgdx进行游戏开发(8)-粒子系统
  7. phython正则表达式 Python Re模块
  8. HDU 6342.Problem K. Expression in Memories-模拟-巴科斯范式填充 (2018 Multi-University Training Contest 4 1011)
  9. 将双击“root的主文件”弹出的窗口设置为文件浏览器
  10. Dfs【p4906】小奔关闹钟