在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(); }
  
 
  |