我有一个非常有趣的情况。我对JBoss和Oracle有点新手,主要在DB2上使用Weblogic。那就是说,我想要做的很简单。
我有一个到Oracle数据库的local-tx-datasource。从我的Java I代码中,我在使用适当的JNDI名称检索数据源之后调用datasource.getConnection()。我的-ds.xml文件中的local-tx-datasource声明没有对autocommit行为的任何显式引用。
获得连接后,我执行创建/更新查询,然后返回正确的更新计数。随后,对于短暂的,我甚至可以检索此记录。然而,在那之后数据库假装它从来没有得到记录,并且根本没有。
我对连接的体验表明,当连接未提交其工作时会发生这种情况,因此只有该连接本身才能在其事务中查看数据。根据我的阅读,JBoss也遵循Connection返回的规范是自动提交的规范。我甚至从我的Java代码中验证了这一点,并且它声明自动提交行为设置为true。但是,如果是这种情况,为什么我的记录没有被创建/更新?
在此之后,我将Connection的自动提交行为设置为false(再次从Java代码中),然后显式执行提交。从那时起,就没有问题了。
可能出现什么问题?我对autocommit的理解是不正确的,还是JBoss对它有一些其他的解释。请注意,我根本没有任何交易。这些是非常简单的单记录插入查询。
答案 0 :(得分:1)
请注意,我根本没有任何交易。
错误的假设。 local-tx-datasource代表您启动JTA事务。我不确定自动提交在这种情况下是如何工作的,但我认为只有当您使用JDBC事务,而不是 JTA事务时,自动提交才适用。
在JTA中,如果您不提交事务[*],它将在超时后回滚。这解释了您遇到的情况。所以,我会尝试将local-tx-datasource更改为no-tx-datasource或手动提交事务。
但请注意,不管理您的交易是一件坏事。应始终避免自动提交。决定何时提交比你的申请没有更好的一方。把这个责任留给司机/集装箱是IMO,不是很负责任:-)
[*]一个例外是EJB内部的操作,其业务方法“自动”包装在JTA事务中。因此,您不需要显式提交事务。