再说JTA和JTS

事务是编程中必不可少的一项内容,基于此,为了规范事务开发,Java增加了关于事务的规范,即JTA和JTS,在网上搜索关于JTA和JTS,发现有效内容远少于EJB,这倒不是说它们的重要性低于EJB,而是说明JTA和JTS封装的更为透明,隐藏了大部分细节,通常情况下,我们仅仅需要使用几个简单的APIs就能解决问题。

JTA和JTS

JTA

JTA定义了一套接口,其中约定了几种主要的角色:TransactionManager、UserTransaction、Transaction、XAResource,并定义了这些角色之间需要遵守的规范,如Transaction的委托给TransactionManager等。

JTS

JTS也是一组规范,上面提到JTA中需要角色之间的交互,那应该如何交互?JTS就是约定了交互细节的规范。

总体上来说JTA更多的是从框架的角度来约定程序角色的接口,而JTS则是从具体实现的角度来约定程序角色之间的接口,两者各司其职。

因为JTA相对来说,更高层一些,我们主要关注JTA。

XA

XA协议,规定事务管理器和资源管理器接口,采用二阶段提交协议。

源码

规范的接口位于javax.transaction:

再说事务

事务从范围上分类,可以分为本地事务和分布式事务。

本地事务

本地事务更常见,可以理解从Connection引出的事务,因为这种事务绑到了连接上,所以仅能对一个连接,一个库起作用,如下代码:

 public void transferAccount()
 {
	 Connection conn = null;
	 Statement stmt = null;
	 try
	 {
		 conn = getDataSource().getConnection();
		 // 将自动提交设置为 false,
		 //若设置为 true 则数据库将会把每一次数据更新认定为一个事务并自动提交
		 conn.setAutoCommit(false);

		 stmt = conn.createStatement();
		 // 将 A 账户中的金额减少 500
		 stmt.execute("		 update t_account set amount = amount - 500 where account_id = 'A'");
		 // 将 B 账户中的金额增加 500
		 stmt.execute("		 update t_account set amount = amount + 500 where account_id = 'B'");

		 // 提交事务
		 conn.commit();
		 // 事务提交:转账的两步操作同时成功
	 }
	 catch(SQLException sqle)
	 {
		 try
		 {
			 // 发生异常,回滚在本事务中的操做
			conn.rollback();
			 // 事务回滚:转账的两步操作完全撤销
			 stmt.close();
			 conn.close();
		 }
		 sqle.printStackTrace();
	 }
}

分布式事务

使用JTA和JTS可以提供了分布式事务服务,分布式事务(Distributed Transaction)包括事务管理器(Transaction Manager)和 XA 协议的资源管理器 ( Resource Manager ),资源管理器看做任意类型的持久化数据存储;事务管理器承担着事务协调与控制。

使用 JTA 处理事务的示例如下(注意:connA 和 connB 是来自不同数据库的连接),如下:

public void transferAccount()
{ 

	 UserTransaction userTx = null;
	 Connection connA = null;
	 Statement stmtA = null; 

	 Connection connB = null;
	 Statement stmtB = null; 

	 try{
		  // 获得 Transaction 管理对象
		 userTx = (UserTransaction)getContext().lookup("			   java:comp/UserTransaction");
		 // 从数据库 A 中取得数据库连接
		 connA = getDataSourceA().getConnection(); 

		 // 从数据库 B 中取得数据库连接
		 connB = getDataSourceB().getConnection(); 

		 // 启动事务
		 userTx.begin();

		 // 将 A 账户中的金额减少 500
		 stmtA = connA.createStatement();
		 stmtA.execute("
		 update t_account set amount = amount - 500 where account_id = 'A'");

		 // 将 B 账户中的金额增加 500
		 stmtB = connB.createStatement();
		 stmtB.execute("		 update t_account set amount = amount + 500 where account_id = 'B'");

		 // 提交事务
		 userTx.commit();
		 // 事务提交:转账的两步操作同时成功(数据库 A 和数据库 B 中的数据被同时更新)
	 }
	 catch(SQLException sqle)
	 {
		try
		 {
		     // 发生异常,回滚在本事务中的操纵
			userTx.rollback();
			 // 事务回滚:转账的两步操作完全撤销
			 //( 数据库 A 和数据库 B 中的数据更新被同时撤销)
			 stmt.close();
			 conn.close();
			sqle.printStackTrace(); 

		}
		catch(Exception ne)
		{
		 e.printStackTrace();
		}
	 }
 }

以上即实现了一个分布式的事务。

JTA事务有效的屏蔽了底层事务资源,但是与本地事务相比,XA协议的系统开销大,在系统开发过程中应慎重考虑是否确实需要分布式事务。若确实需要分布式事务以协调多个事务资源,则应实现和配置所支持 XA 协议的事务资源,如 JMS、JDBC 数据库连接池等。

EJB事务

使用JTA为EJB提供事务,结合注解的方式也非常直观,只需要提供@TransactionManagement和@TransactionAttribute,并提供相应属性配置即可,如:

@Stateless
@Remote({ ITemplateBean.class })
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class TemplateBeanImpl implements ITemplateBean {
	//code...
}

总结

关键接口

先介绍一下JTA的规范接口中,主要围绕以下几个接口:

  • UserTransaction:编程人员接口
  • TransactionManager:留给厂商实现的与事务管理有关的接口
  • Transaction:留给厂商实现的事务
  • XAResource:留给厂商实现的与持久化资源有关的接口

接口类中的接口定义可参见源码,几个接口类关系如下:

下载了JBoss的JTA实现源码,但是发现深入这个源码有难度,且需要的时间也会较长,故留着以后学习。JBoss的JTA实现是Narayana,SVN地址为https://github.com/jbosstm/narayana,如果有兴趣可以研究一下。

总结

JTA总结到此告一段落,事务的阶段提交详见我的博客《事务的一阶段提交协议和二阶段提交协议》

时间: 2024-08-05 11:12:58

再说JTA和JTS的相关文章

JTA和JTS

姓名:陈柳静  班级:软件151 事务是编程中必不可少的一项内容,基于此,为了规范事务开发,Java增加了关于事务的规范,即JTA和JTS,在网上搜索关于JTA和JTS,发现有效内容远少于EJB,这倒不是说它们的重要性低于EJB,而是说明JTA和JTS封装的更为透明,隐藏了大部分细节,通常情况下,我们仅仅需要使用几个简单的APIs就能解决问题.JTA和JTS    JTA    JTA定义了一套接口,其中约定了几种主要的角色:TransactionManager.UserTransaction.

jta 知识

JTA知识(转载原文地址:http://blog.csdn.net/it_man/article/details/7230215) Java Transaction API,译为Java事务API.JTA允许应用程序执行分布式事务处理——在两个或多个网络计算机资源上访问并且更新数据.JTA主要用于分布式的多个数据源的两阶段提交的事务,而JDBC的Connection提供的单个数据源的事务; 后者因为只涉及到一个数据源,所以其事务可以由数据库自己单独实现, 而JTA事务因为其分布式和多数据源的特性

J2EE的13个规范总结

什么是J2EE? 在企业级应用中,都有一些通用企业需求模块,如数据库连接,邮件服务,事务处理等.既然很多企业级应用都需要这些模块,一些大公司便开发了自己的通用模块服务,即中间件.这样一来,就避免了重复开发,开发周期长和代码可靠性差等问题.但是,各公司的中间件不兼容的问题就出现了,用户无法将它们组装在一起为自己服务.于是,"标准"就应运而生了. J2EE就是基于JAVA技术的一系列标准. J2EE是Java2平台企业版(Java 2Platform Enterprise Edition)

JBoss Web和 Tomcat的区别

JBoss Web和 Tomcat的区别2009-12-14 11:18在Web2.0的浪潮中,各种页面技术和框架不断涌现,为服务器端的基础架构提出了更高的稳定性和可扩展性的要求.近年来,作为开源中间件的全 球领导者,JBoss在J2EE应用服务器领域已成为发展最为迅速的应用服务器.在市场占有率和服务满意度上取得了巨大的成功,丝毫不逊色于其它的非开源 竞争对手,如WebSphere.WebLogic.Application Server.JBoss Web的诸多优越性能,正是其广为流行的原因.

J2EE的十三种技术

? ? 引言 ? ? J2EE的十三种技术在网上一搜多的是,比如附录中的那篇文档就已经涵盖的很全了,但是作为应用级开发者并不一定要对这十三种技术都掌握,而且这十三种技术中哪些重要哪些不重要也存在一定的区别,所以我对一些重要的技术提炼出来放在概要里,方便读者快速掌握,而且学习也好有偏重 ? ? 概要 ? ? 这个也可以作为学习Java的路线,其实Java主要的技术包括Java基础部分,也就是面向对象,集合,界面,线程,文件以及网络:以及往网页方面走的JSP,Servlet,JS,其实如果读者接触过

15个nosql数据库

1.MongoDB 介绍 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.主要解决的是海量数据的访问效率问题,为WEB应用提供可扩展的高性能数据存储解决方案.当数据量达到50GB以上的时候,MongoDB的数据库访问速度是MySQL的10倍以上.MongoDB的并发读写效率不是特别出色,根据官方提供的性能测试表明,大约每秒可以处理0.5万~1.5万次读写请求.MongoDB还自带了一个出色的分布式文件系统GridFS,可以支持海量的数据存储. MongoDB也有一个Ruby的项

转 : JBoss Web和 Tomcat的区别

JBoss Web和 Tomcat的区别 在Web2.0的浪潮中,各种页面技术和框架不断涌现,为服务器端的基础架构提出了更高的稳定性和可扩展性的要求.近年来,作为开源中间件的全 球领导者,JBoss在J2EE应用服务器领域已成为发展最为迅速的应用服务器.在市场占有率和服务满意度上取得了巨大的成功,丝毫不逊色于其它的非开源 竞争对手,如WebSphere.WebLogic.Application Server.JBoss Web的诸多优越性能,正是其广为流行的原因. 基于Tomcat内核,青胜于蓝

常见的web容器与应用程序服务器区别及对比

tomcat 类型:servlet容器和HTTP web服务器 功能:实现了一些J2EE特性包括Java Servlet.JSP页面.Java EL和websocket,还有纯java的http web server. 重要组件: catalina是一个servlet容器 coyote是连接器 Jasper是tomcat JSP引擎,解析编译JSP称为servlet,运行时,可以检测JSP的改动并且重新编译它们. Cluster用来管理大型应用,用来做LB WAS(Wephere Applica

【转】JBoss Web和 Tomcat的区别

转载于:http://www.verydemo.com/demo_c202_i780.html JBoss Web和 Tomcat的区别 在Web2.0的浪潮中,各种页面技术和框架不断涌现,为服务器端的基础架构提出了更高的稳定性和可扩展性的要求.近年来,作为开源中间件的全 球领导者,JBoss在J2EE应用服务器领域已成为发展最为迅速的应用服务器.在市场占有率和服务满意度上取得了巨大的成功,丝毫不逊色于其它的非开源 竞争对手,如WebSphere.WebLogic.Application Ser