0

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

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

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

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

在此之后,我将 Connection 的自动提交行为设置为 false(同样来自 Java 代码),然后明确地进行提交。从那时起,就没有问题了。

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

4

1 回答 1

1

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

错误的假设。local-tx-datasource 代表您启动 JTA 事务。我不确定自动提交在这种情况下是如何工作的,但我认为自动提交仅在您使用专门的 JDBC 事务而不是JTA 事务时适用。

在 JTA 中,如果您不提交事务[*],它将在超时后回滚。这解释了您遇到的情况。因此,我会尝试将 local-tx-datasource 更改为 no-tx-datasource 或手动提交事务。

但是请注意,管理您的交易是一件坏事。应始终避免自动提交。没有比您的应用程序更好的方式来确定何时提交。把这个责任留给司机/集装箱是,IMO,不是很负责任:-)

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

于 2011-05-12T07:32:16.873 回答