[原创]JTA全局事务控制_Tomcat, WebLogic及J2EE讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Tomcat, WebLogic及J2EE讨论区 »
总帖数
2
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2796 | 回复: 1   主题: [原创]JTA全局事务控制        下一篇 
    本主题由 hui.chen 于 2014-11-11 15:06:53 移动
xiuwen.zhao
高级会员
等级:上尉
经验:668
发帖:38
精华:0
注册:1970-1-1
状态:离线
发送短消息息给xiuwen.zhao 加好友    发送短消息息给xiuwen.zhao 发消息
发表于: IP:您无权察看 2014-9-2 23:02:35 | [全部帖] [楼主帖] 楼主

通过使用JTA编程,开发者可以用一种与事务管理器无关的方式来开始、提交或回滚事务,JavaEE应用服务器通过Java事务服务(JTS)来实现事务管理器。但应用程序代码无须直接调用JTS方法,它只需面向JTA方法即可,由JTA来调用底层的JTS进行处理。

JTA事务由Java EE事务管理器负责控制,它可以保证多个数据库更新的一致性,通过JTA即可实现全局事务控制。

下面通过一个例子介绍WebLogic服务器中使用JTA来保证多数据库的一致性。首先在WebLogic服务器中配置两个支持XA规范的数据源,两个数据源都是连接到Oracle数据库。在一个web工程内写一个JSP页面,代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="javax.naming.*"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="javax.transaction.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
<%
Context ctx = new InitialContext();
DataSource ds1 = (DataSource) ctx.lookup("ds1");
DataSource ds2 = (DataSource) ctx.lookup("ds2");
UserTransaction tx = (UserTransaction) ctx
.lookup("javax.transaction.UserTransaction");
Connection conn1 = ds1.getConnection();
Connection conn2 = ds2.getConnection();
Statement stmt1 = null;
Statement stmt2 = null;
tx.begin();
try {
      stmt1 = conn1.createStatement();
      stmt2 = conn2.createStatement();
      int result = stmt1
      .executeUpdate("insert into city values(79999,'zaiven','ch','wuhan','2000000')");
      out.println(result == 1 ? "success" : "fail");
      stmt2.executeUpdate("insert into actor values(1,'zhao','tom','2002-1-3')");
      tx.commit();
} catch (Exception e) {
      e.printStackTrace();
      tx.rollback();
} finally {
stmt1.close();
stmt2.close();
conn1.close();
conn2.close();
}
%>
</body>
</html>


要在WebLogic服务器中获取JTA事务管理器,只需查询到JNDI名为javax.transaction.UserTransaction的对象即可。上面的代码是一个典型的JTA事务控制逻辑,程序依次执行多个数据库访问,当所有数据库访问都可以成功时,程序通过JTA控制全局事务提交。只要一个数据库的数据访问失败,JTA控制全局事务就回滚,通过这种方式既可以处理跨越多个数据库的分布式事务,保证多个数据库的一致性。

访问上面的页面,看到第一个数据库的插入操作成功的提示,但是由于第二个数据库的操作失败,这将导致整个全局事务回滚,因此第一个数据库的插入操作依然没有生效。

该贴由hui.chen转至本版2014-11-11 15:06:53

该贴由hui.chen转至本版2014-11-11 15:08:03




赞(0)    操作        顶端 
koei
版主
等级:大校
经验:4180
发帖:7
精华:0
注册:2011-7-21
状态:离线
发送短消息息给koei 加好友    发送短消息息给koei 发消息
发表于: IP:您无权察看 2014-9-3 9:38:12 | [全部帖] [楼主帖] 2  楼

的确,JTA是J2EE规范的一部分,包括WebLogic在内的都必须按这个要求做产品 北京联动北方科技有限公司



赞(0)    操作        顶端 
总帖数
2
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论