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



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

以上代码在ut2.begin() 是就提示错误....在一个Thead 不能同事开起两个事务
javax.transaction.NotSupportedException: Attempt to start a nested transaction (the transaction started previously hasn't been ended yet).

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

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



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

只能使用一个JNDI,可以调整为:
通过一个JBOSS调用两个数据库;这一步很简单。
或者将两个JBoss的JNDI调整为一个,可能需要修改JBOSS为集群配置,具体可参考。


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

我将Context2 JNDI手动绑定到Context1 ,事务就用context1来控制,也不行。
数据库用的mysql5.1 innodb + 服务器用的 JBOSS6

注意,别忘记用XA分布式事务,mysql-ds.xml等配置都要用XA的。