EJB学习笔记之十(BMT事务和CMT事务)
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比較的灵活。能够自己採用编码的方式来管理事务,自己确定事务的边界。两种事务的使用,须要依据自身业务的须要来确定。
EJB学习笔记之十(BMT事务和CMT事务)的更多相关文章
- Redis学习笔记(十) 命令进阶:事务操作
原文链接:http://doc.redisfans.com/transaction/index.html Redis中也提供了对于事务的支持,由于Redis是单线程处理Client的请求,所以实现起来 ...
- Java框架spring 学习笔记(十八):事务管理(xml配置文件管理)
在Java框架spring 学习笔记(十八):事务操作中,有一个问题: package cn.service; import cn.dao.OrderDao; public class OrderSe ...
- Java框架spring Boot学习笔记(六):Spring Boot事务管理
SpringBoot和Java框架spring 学习笔记(十九):事务管理(注解管理)所讲的类似,使用@Transactional注解便可以轻松实现事务管理.
- Binder学习笔记(十二)—— binder_transaction(...)都干了什么?
binder_open(...)都干了什么? 在回答binder_transaction(...)之前,还有一些基础设施要去探究,比如binder_open(...),binder_mmap(...) ...
- VSTO学习笔记(十四)Excel数据透视表与PowerPivot
原文:VSTO学习笔记(十四)Excel数据透视表与PowerPivot 近期公司内部在做一种通用查询报表,方便人力资源分析.统计数据.由于之前公司系统中有一个类似的查询使用Excel数据透视表完成的 ...
- VSTO 学习笔记(十二)自定义公式与Ribbon
原文:VSTO 学习笔记(十二)自定义公式与Ribbon 这几天工作中在开发一个Excel插件,包含自定义公式,根据条件从数据库中查询结果.这次我们来做一个简单的测试,达到类似的目的. 即在Excel ...
- VSTO学习笔记(十五)Office 2013 初体验
原文:VSTO学习笔记(十五)Office 2013 初体验 Office 2013 近期发布了首个面向消费者的预览版本,我也于第一时间进行了更新试用.从此开始VSTO系列全面转向Office 201 ...
- VSTO 学习笔记(十)Office 2010 Ribbon开发
原文:VSTO 学习笔记(十)Office 2010 Ribbon开发 微软的Office系列办公套件从Office 2007开始首次引入了Ribbon导航菜单模式,其将一系列相关的功能集成在一个个R ...
- Python学习笔记(十四)
Python学习笔记(十四): Json and Pickle模块 shelve模块 1. Json and Pickle模块 之前我们学习过用eval内置方法可以将一个字符串转成python对象,不 ...
随机推荐
- delphi.memory.分配及释放---New/Dispose, GetMem/FreeMem及其它函数的区别与相同,内存分配函数
来自:http://www.cnblogs.com/qiusl/p/4028437.html?utm_source=tuicool&utm_medium=referral ---------- ...
- hdu 3768(spfa+暴力)
Shopping Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- cmake 查找头文件和库文件顺序
cmake会先到*_DIR里指定.cmake文件里去找找不到了才会到/usr里去找 所以要小心cmake给你找的文件,如果在一台电脑里装了不止一个版本库.
- C#在 64位系统下出现 “未能加载文件或程序集”错误
64位系统下,Build的时候,如果选择Any CPU,默认会按照64位进行编译,便无法加载某些旧的dll,这些dll可能是特定到X86 CPU的. 所以,把编译选项中改为 X86CPU,就可以运行了 ...
- summernote文本编辑内容在前端的显示
1.summernote文本的编辑与文件的上传 在上一篇文章中,我们写了summernote文本编辑器的使用还有图片文件的上传,http://www.cnblogs.com/jingmin/p/659 ...
- python 执行顺序
从上往下顺序执行,定义的方法和类要写在调用之前, 如果有 if __name__ == '__main__' 改方法所在的文件作为启动文件时会被调用,如果作为模块被调用时不会被执行.
- Dijkstra【p4943】密室
Description 密室被打开了. 哈利与罗恩进入了密室,他们发现密室由n个小室组成,所有小室编号分别为:1,2,...,n.所有小室之间有m条通道,对任意两个不同小室最多只有一条通道连接,而每通 ...
- 洛谷——P2128 赤壁之战
P2128 赤壁之战 题目描述 赤壁之战,黄盖率舰满载薪草膏油诈降曹军. 受庞统所授的连环计,曹军战船之间由铁索相连,没有两艘战船在同一位置,也没有铁索两两相交或穿过战船.每艘船都有其一定的战略价值. ...
- POJ1258 Agri-Net(Prim)
Agri-Net Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 51685 Accepted: 21558 Descri ...
- mysql 列转行,合并字段的方法
数据表(表名:xsk) +----+------+-----------+-------+ | id | name| course | score | +----+------+----------- ...