多个Context 下事务 可以控制吗?

10-12-25 zuiwoxing

      Context c1 =  new InitialContext(props1);
     Context c2 = new InitialContext(props2);
     UserService userService = (UserService)c1.lookup("UserServiceRemote/remote");
     AdminService adminService = (AdminService )c1.lookup("AdminServiceRemote/remote");

    

     UserTransaction ut1 = null;
     UserTransaction ut2 = null;
    try {
     ut1 =(UserTransaction) c1.lookup("java:/UserTransaction");
     ut2 = (UserTransaction) c2.lookup("java:/UserTransaction");
     ut1.begin();
     ut2.begin();
     userService.add(user);// 增加
      adminService.add(admin);//增加
     ut1.commit();
     ut2.commit();


   }catch(Exception e) {
      if (ut1 != null) {
         ut1.rollback();
     }
      if (ut2 != null) {
         ut2.rollback();
     }
  }
<p>

以上代码在ut2.begin() 是就提示错误....在一个Thead 不能同事开起两个事务

javax.transaction.NotSupportedException: Attempt to start a nested transaction (the transaction started previously hasn't been ended yet).

在两个或多个Context 下怎么控制事务呢?

         

1
zuiwoxing
2010-12-25 18:08
banq 在吗? 请帮我分析一下,需要怎么可以实现! 谢谢

context1 上下文环境是一个JBOSS 对应一个数据库

context2 上下文环境是另一个JBOSS 对就另外一个数据库

以下代码是放在Tomcat 里通过JBOSS 客户端去调用的

  Context c1 =  new InitialContext(props1);  
 Context c2 = new InitialContext(props2);
UserService userService = (UserService)c1.lookup("UserServiceRemote/remote");
AdminService adminService = (AdminService )c1.lookup("AdminServiceRemote/remote");         UserTransaction ut1 = null;   
UserTransaction ut2 = null; 
 try {     
ut1 =(UserTransaction) c1.lookup("java:/UserTransaction");  
 ut2 = (UserTransaction) c2.lookup("java:/UserTransaction");  
   ut1.begin();   
  ut2.begin();   
  userService.add(user);// 增加   
   adminService.add(admin);//增加   
  ut1.commit();   
  ut2.commit();   
}catch(Exception e) {  
    if (ut1 != null) {  
       ut1.rollback();    
 }     
 if (ut2 != null) {   
      ut2.rollback();   
  }  
}
<p>

[该贴被zuiwoxing于2010-12-25 18:20修改过]

banq
2010-12-26 12:05
只能使用一个JNDI,可以调整为:

通过一个JBOSS调用两个数据库;这一步很简单。

或者将两个JBoss的JNDI调整为一个,可能需要修改JBOSS为集群配置,具体可参考。

[该贴被banq于2010-12-26 12:20修改过]

zuiwoxing
2010-12-28 22:17
我将Context2 JNDI手动绑定到Context1 ,事务就用context1来控制,也不行。

数据库用的mysql5.1 innodb + 服务器用的 JBOSS6

banq
2010-12-29 10:26
注意,别忘记用XA分布式事务,mysql-ds.xml等配置都要用XA的。

猜你喜欢