欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

JTA和JTS

最编程 2024-07-23 12:37:21
...
 再说事务    
    事务从范围上分类,可以分为本地事务和分布式事务。
    本地事务
    本地事务更常见,可以理解从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();
}
 } 
 }