在复杂的J2EE应用中,如果涉及到要在一个事务中将数据保存到多个数据库,或者在一个事务中同时要操作数据库资源和JMS资源,
为了保证数据在多个参入的数据源中的一致性,就需要用到JTA来控制事务,参入的数据源也需要支持X/Open协议(两阶段提交).
本文简单介绍如何在weblogic中使用JTA和解释JTA的TransactionManager是怎么定义事务边界和提交回滚事务的.
JTA的使用:
1,通过JNDI得到TransactionManager,然后可以用TransactionManager的begin,commit等方法来控制事务.
traMgr = (TransactionManager) context.lookup("javax.transaction.UserTransaction");
2,获取在weblogic上定义的datasource,datasource必须支持XA.
DataSource ds1 = (DataSource)context.lookup("DSORCL");
3,用TransactionManager声明事务开始,通过DataSource操作数据库,然后commit或者rollback事务.
traMgr.begin();
...//通过DataSource得到connection,然后操作数据库.
traMgr.commit();或者traMgr.rollback();
有时候,数据源可能不是在weblogic上配置的,或者是从不同的APP server上获取的(不过这种情况一般比较少).需要利用
TransactionManager.enlistResource(XAResource)主动的把这种资源加入到当前的事务管理中来.而对于从weblogic上
配置的DataSource,TransactionManager声明事务后,DataSource可以自动的发现并加入当前的事务.TransactionManager在
begin()的时候会将当前的事务信息绑定到当前的线程上.
为了保证数据在多个参入的数据源中的一致性,就需要用到JTA来控制事务,参入的数据源也需要支持X/Open协议(两阶段提交).
本文简单介绍如何在weblogic中使用JTA和解释JTA的TransactionManager是怎么定义事务边界和提交回滚事务的.
JTA的使用:
1,通过JNDI得到TransactionManager,然后可以用TransactionManager的begin,commit等方法来控制事务.
traMgr = (TransactionManager) context.lookup("javax.transaction.UserTransaction");
2,获取在weblogic上定义的datasource,datasource必须支持XA.
DataSource ds1 = (DataSource)context.lookup("DSORCL");
3,用TransactionManager声明事务开始,通过DataSource操作数据库,然后commit或者rollback事务.
traMgr.begin();
...//通过DataSource得到connection,然后操作数据库.
traMgr.commit();或者traMgr.rollback();
有时候,数据源可能不是在weblogic上配置的,或者是从不同的APP server上获取的(不过这种情况一般比较少).需要利用
TransactionManager.enlistResource(XAResource)主动的把这种资源加入到当前的事务管理中来.而对于从weblogic上
配置的DataSource,TransactionManager声明事务后,DataSource可以自动的发现并加入当前的事务.TransactionManager在
begin()的时候会将当前的事务信息绑定到当前的线程上.
Java代码示例:
public class TraMgrExample {
public void executeTra1(Connection conn) throws SQLException{
PreparedStatement pstmt = conn.prepareStatement("Insert into A values(3,'VAL1')");
pstmt.executeUpdate();
pstmt.close();
}
public void executeTraOutWlS(Connection conn ) throws SQLException{
PreparedStatement pstmt = conn.prepareStatement("Insert into B values(1,'TRANSACTION MANAGER TEST')");
pstmt.executeUpdate();
pstmt.close();
}
public void testGlobalTransaction() {
System.out.println("testGlobalTransaction.");
TransactionManager traMgr = null;
Connection conn1