我正在构建一个使用CDI(焊接容器)和@ConversationScope作为视图的应用程序。我需要在对话开始时启动JTA事务并在结束时提交/回滚。所以我编写了这个:
@Named
@ConversationScoped
public class ConversationBean implements Serializable {
private @Inject UserTransaction utx;
private @Inject Conversation conversation;
public void startConversation(){
conversation.begin();
try {
utx.begin();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void stopConversation(){
conversation.end();
try {
utx.commit();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
但结果是,当我开始对话/交易时
09:23:33,795错误[org.jboss.as.txn](http - 127.0.0.1-8180-1)JBAS010152:应用程序错误:事务仍处于请求状态为0的活动
当我发出提交时:
09:23:56,513 ERROR [stderr](http - 127.0.0.1-8180-1)java.lang.IllegalStateException:BaseTransaction.commit - ARJUNA016074:no transaction!
知道这怎么可行?我的环境是JBoss应用服务器7.1.1(焊接容器)。 谢谢 琳达
答案 0 :(得分:2)
我认为你的想法存在一些问题。当事务绑定到服务器上的线程时,会话跨越多个请求(否则您将使用请求范围)。多个请求不是(必然,特别是在服务多个客户端的Web应用程序上)绑定到同一个线程。当您使用数据库或其他事务资源时,您需要进行事务处理。你应该重新考虑一下。