JBoss自动提交到Oracle并不总是有效

JBoss自动提交到Oracle并不总是有效,oracle,jboss,commit,autocommit,Oracle,Jboss,Commit,Autocommit,我有一个非常有趣的情况。我对JBoss和Oracle有点陌生,主要是在DB2上使用Weblogic。也就是说,我想做的很简单 我有一个到Oracle数据库的本地tx数据源。从我的Javai代码中,我在使用适当的JNDI名称检索数据源之后调用datasource.getConnection()。my-ds.xml文件中的本地tx数据源声明没有任何对自动提交行为的明确引用 获得连接后,我执行创建/更新查询,并返回正确的更新计数。随后,在很短的时间内,我甚至能够检索到这条记录。然而,在那之后,数据库假

我有一个非常有趣的情况。我对JBoss和Oracle有点陌生,主要是在DB2上使用Weblogic。也就是说,我想做的很简单

我有一个到Oracle数据库的本地tx数据源。从我的Javai代码中,我在使用适当的JNDI名称检索数据源之后调用datasource.getConnection()。my-ds.xml文件中的本地tx数据源声明没有任何对自动提交行为的明确引用

获得连接后,我执行创建/更新查询,并返回正确的更新计数。随后,在很短的时间内,我甚至能够检索到这条记录。然而,在那之后,数据库假装它从一开始就没有得到记录,并且什么都没有

我在连接方面的经验表明,当连接没有提交其工作时,就会发生这种情况,因此只有连接本身才能看到其事务中的数据。从我读到的内容来看,JBoss也遵循了返回的连接是自动提交连接的规范。我甚至从我的Java代码中验证了这一点,它表明自动提交行为设置为true。但是,如果是这样,为什么我的记录没有被创建/更新

接下来,我将连接的自动提交行为设置为false(同样来自Java代码),然后显式地进行提交。从那时起,就没有问题了

可能出了什么问题?是我对自动提交的理解不正确,还是JBoss对此有其他解释。请注意,我根本没有任何交易。这些是非常简单的单记录插入查询

请注意,我根本没有任何交易

错误的假设。本地tx数据源代表您启动JTA事务。我不确定autocommit在这种情况下是如何工作的,但我认为autocommit只适用于专门使用JDBC事务而不是JTA事务的情况

在JTA中,如果不提交事务[*],它将在超时后回滚。这解释了您正在经历的场景。因此,我会尝试将本地tx数据源更改为no tx数据源,或者手动提交事务

但是,请注意,不管理事务是一件坏事。应始终避免自动提交。没有比您的应用程序更好的一方来决定何时提交。在国际海事组织,将这一责任留给司机/集装箱不是很负责任:——)


[*]一个例外是EJB内部的操作,其业务方法“自动”包装在JTA事务中。因此,不需要显式提交事务

你能帮我理解你所说的“独占”JDBC是什么意思吗?我的代码执行上下文查找,获取此本地tx数据源,并对其调用getConnection()方法。结果就是这种联系。现在我做了一个UserTransaction.getStatus()来检查它是否在一个事务中,它返回了一个Status.Status\u NO\u事务您的连接由容器管理,它被包装在一个JTA事务中,而不是JDBC事务中。事实上,我并不期望看到它报告“Status.Status\u NO\u TRANSACTION”,所以,我可能错了。所谓“独占JDBC事务”,我的意思是不使用来自容器的托管连接,以确保没有JTA包装它。例如,像在独立应用程序中一样创建连接(不从容器中获取)。然后,查看该行为是否持续。