同时使用AutoCommit和UserTransaction

时间:2015-09-23 06:40:29

标签: java sql transactions database-connection

想知道下面是否正确?

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如何运作的知识?我基本上知道如何使用它,但没有具体的想法,当我使用它时我应该注意什么。

1 个答案:

答案 0 :(得分:0)

  

使用容器管理的事务划分的Enterprise Bean   不得使用任何干扰的交易管理方法   容器的事务划分边界。这样的例子   方法是commit,setAutoCommit和rollback方法   java.sql.Connection或者提交和回滚方法   javax.jms.Session。如果您需要控制交易   划分时,必须使用应用程序管理的事务划分。

     

使用容器管理的事务划分的Enterprise Bean   也不能使用javax.transaction.UserTransaction接口。

我已阅读this,我认为可能同时使用交易和autoCommit并不是一个好主意。