Java分布式事务概念与实现示例

原创 2005年05月26日 15:13:00

在java中有如下三种事务,

  • 简单的JDBC级的事务
  • JTA - 在EJB环境下,用户得到事务并进行控制
  • CMP - 完全由容器控制事务,用户通过Bean配置文件来定义事务行为

二三种都支持分布式事务,但只支持Java环境下的分布式事务。

下面讨论如何在Java程序里实现分布式事务,即在同一个事务里访问多个数据源。实际上就是如何使用JTA.

这里假设使用Oracle数据库,使用WebLogic部署应用,所要做的是如下几步:

1. 配置

1.1 确认数据库支持分布式事务 - oracle是支持分布式事务的,JDBC驱动也支持分布式事务

1.2 在WebLogic里配置DataSource

1.2.1. 配置连接池,注意这里应该选择驱动是Thin XA而不是Thin

1.2.2. 配置数据源,使用前面配好的XA的连接池

2. 程序实现

2.1. 实现自己的Xid

import javax.transaction.xa.*;
public class MyXid implements Xid
{
 protected int formatId;
 protected byte gtrid[];
 protected byte bqual[];
 public MyXid()
 {
 }
 public MyXid(int formatId, byte gtrid[], byte bqual[])
 {
  this.formatId = formatId;
  this.gtrid = gtrid;
  this.bqual = bqual;
 }

 public int getFormatId()
 {
  return formatId;
 }

 public byte[] getBranchQualifier()
 {
  return bqual;
 }

 public byte[] getGlobalTransactionId()
 {
  return gtrid;
 }

}
2.2. 通过JNDI找到WebLogic中配置好的数据源

public XADataSource getXADataSource()
 throws Exception
{
InitialContext ctx = new InitialContext( mgr.getProps());
XADataSource ds = (XADataSource)ctx.lookup("jdbc/xaDS");
return ds;
}
2.3. 使用XADataSource得到XAConnection,使用XAConnection得到XAResource,基于XAResource进行具体数据访问。如果我们这里lookup多个XADataSource,然后得到多个XAResource,就可以实现多数据源的事务控制。

XADataSource xaDS;
XAConnection xaCon;
XAResource xaRes;
Xid xid;
Connection con;
Statement stmt;
int ret;
xaDS = getXADataSource();
xaCon = xaDS.getXAConnection();
xaRes = xaCon.getXAResource();
con = xaCon.getConnection();
stmt = con.createStatement();
xid = new MyXid(100, new byte[]{0x01}, new byte[]{0x02});
try {
  xaRes.start(xid, XAResource.TMNOFLAGS);
  stmt.executeUpdate("insert into test_table values (100)");
  xaRes.end(xid, XAResource.TMSUCCESS);
  ret = xaRes.prepare(xid);
  if (ret == XAResource.XA_OK) {
    xaRes.commit(xid, false);
   }
}
catch (XAException e) {
 e.printStackTrace();
}
finally {
 stmt.close();
 con.close();
 xaCon.close();
}

分布式事务-例子讲解

从一个典型例子入手讲下分布式事务。 分布式事务的典型例子: 跨行转账 银行A的账号 Bob 银行B的账号 Smith 银行A的模块,库A Bob向Smith转账100元 两阶段 ...
  • jjavaboy
  • jjavaboy
  • 2017年08月09日 22:38
  • 485

java分布式事务

在本系列先前的文章中,我们主要讲解了JDBC对本地事务的处理,本篇文章将讲到一个分布式事务的例子。     请通过以下方式下载github源代码: git clone https:/...
  • moonpure
  • moonpure
  • 2016年10月10日 17:30
  • 4349

Java JDBC事务与JTA分布式事务

Java事务的类型有三种:JDBC事务、JTA(Java Transaction API)事务、容器事务。 常见的容器事务如Spring事务,容器事务主要是J2EE应用服务器提供的,容器事务大多是基于...
  • boonya
  • boonya
  • 2016年08月19日 17:02
  • 1386

Zookeeper(一)分布式事务

我们都知道普通的事务中有原子性,一致性,隔离性,持久性。而分布式事务中也有这些属性,下面我们就来介绍一下分布式事务与普通的事务有何不同之处。 分布式事务 随着分布式计算的发展,事务在分布式中也得到了广...
  • u012291108
  • u012291108
  • 2016年12月26日 21:27
  • 6046

MQ实现分布式事务

最近新框架研究设计到了分布式事务的问题,我们目前定的方案就是用MQ解决,正在研究中。...
  • u010928470
  • u010928470
  • 2016年06月30日 20:22
  • 565

Java互联网架构-深入理解MQ实现分布式事务

Java小马哥 2017-10-22 22:20 概述 分布式系统(distributedsystem)是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。因此...
  • u011277123
  • u011277123
  • 2017年10月27日 14:25
  • 163

Java继承_概念与实现(一)

继承就是子类继承父类行为,表明子类是一种特殊的父类,并且具有父类所不具有的一些属性或方法。         概念不容易理解,举个大家都熟悉的魔兽游戏例子,加深一下理解继承。          通过上面...
  • widenstage
  • widenstage
  • 2017年04月27日 21:40
  • 391

分布式事务及分布式系统一致性解决方案

在分布式系统中,同时满足“一致性”、“可用性”和“分区容错性”三者是不可能的。分布式系统的事务一致性是一个技术难题,各种解决方案孰优孰劣? 在OLTP系统领域,我们在很多业务场景下都会面临事务一致性...
  • dinglang_2009
  • dinglang_2009
  • 2016年07月02日 10:46
  • 15849

分布式事务-阿里

转于自己在公司的Blog:  http://pt.alibaba-inc.com/wp/experience_1264/distributed-transaction.html  关于Dubb...
  • joeyon
  • joeyon
  • 2015年08月10日 11:09
  • 1553

关于分布式事务

一、普通事务与分布式事务1.1 普通事务普通事务就是一般所说的数据库事务,大家对数据库事务应该都很了解,这里再简单介绍下。事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。...
  • suifeng3051
  • suifeng3051
  • 2016年09月28日 18:51
  • 5520
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java分布式事务概念与实现示例
举报原因:
原因补充:

(最多只允许输入30个字)