想知道下面是否正确?
UserTransaction ut = getUserTransaction();
ut.begin();
conn = dataSource.getConnection();
conn.setAutoCommit(false);
stmt = conn.createStatement();
// perform statement query udpate here
// do i need to call conn.commit? or ut.commit will handle it implicitly?
ut.commit();
我在我公司的一个项目中看到了代码片段,我对其进行了测试并发现了一些奇怪的行为,所以我不确定,我们是否应该明确调用conn.commit()
?或者让ut.commit()
处理所有交易本身?
所以它开始让我混淆我们应该放在UserTransaction.begin()
和UserTransaction.commit()
中的内容?由于它应该主要是SQL语句执行代码,是否有必要在块内包含conn = dataSource.getConnection();
?因此,特定statement
生成的所有connection
都会像我们使用AutoCommit(false)
一样隐式行为?如果我们在块之外声明(conn = dataSource.getConnection()
)会发生什么?交易处理仍然有效吗?
任何人请分享一些关于UserTransaction
如何运作的知识?我基本上知道如何使用它,但没有具体的想法,当我使用它时我应该注意什么。
答案 0 :(得分:0)
使用容器管理的事务划分的Enterprise Bean 不得使用任何干扰的交易管理方法 容器的事务划分边界。这样的例子 方法是commit,setAutoCommit和rollback方法 java.sql.Connection或者提交和回滚方法 javax.jms.Session。如果您需要控制交易 划分时,必须使用应用程序管理的事务划分。
使用容器管理的事务划分的Enterprise Bean 也不能使用javax.transaction.UserTransaction接口。
我已阅读this,我认为可能同时使用交易和autoCommit
并不是一个好主意。