如果未显式提交或回滚,则自动提交事务

发布于 2024-12-06 06:16:32 字数 154 浏览 1 评论 0原文

我们使用 Weblogic 服务器,并在连接到 Oracle 10g 时始终将 autoCommit 设置为“false”。

我想知道 Weblogic 中是否有一个设置,如果未从应用程序代码中显式调用提交或回滚,它将自动提交事务。我听说 Websphere 中也有类似的设置。

we use Weblogic server and always set autoCommit to 'false' when getting Connection to Oracle 10g.

I want to know if there is a setting in Weblogic wherein it will automatically Commit transactions if a Commit or Rollback is not explicitly called from within application code. I heard similar setting exists in Websphere.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

北凤男飞 2024-12-13 06:16:32

看起来您没有使用容器管理或 Bean 管理的事务。或者,就此而言,您只是从 DataSource 检索连接,然后禁用 autocommit,而无需初始建立事务上下文;这意味着您正在使用 JDBC 事务(依赖于底层数据库的事务管理器)。

当您使用容器或 Bean 管理的事务时,您将不再需要担心事务中使用的 Connectionautocommit 属性,因为容器将确保 <在将 Connection 返回到应用程序之前,将 code>autocommit 属性设置为 false。

如果您需要使用容器管理的事务,则需要使用 EJB。任何与 EJB 关联的事务都将自动提交,除非抛出 RuntimeException 或 ApplicationException。
如果您需要使用 Bean 管理或编程事务,则必须使用 UserTransaction API。

如果您使用像 Hibernate 这样负责建立连接的 ORM 框架,那么您应该记住,是 Hibernate 负责关闭 Connection 的自动提交属性。在大多数情况下,它会关闭该属性。

如果您打算使用 JDBC 事务,尽管有更好的 JTA 事务替代方案,那么您可以尝试从管理控制台或数据源的 JDBC 配置文件中设置驱动程序的 defaultAutoCommit 属性。 JDBC 配置文件的片段如下所示:

<?xml version='1.0' encoding='UTF-8'?>
<jdbc-data-source xmlns="http://xmlns.oracle.com/weblogic/jdbc-data-source" xmlns:sec="http://xmlns.oracle.com/weblogic/security" xmlns:wls="http://xmlns.oracle.com/weblogic/security/wls" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/weblogic/jdbc-data-source http://xmlns.oracle.com/weblogic/jdbc-data-source/1.0/jdbc-data-source.xsd">
  <name>JDBC Data Source-Oracle</name>
  <jdbc-driver-params>
    <url>jdbc:oracle:thin:@localhost:1521:oracle</url>
    <driver-name>oracle.jdbc.OracleDriver</driver-name>
    <properties>
      <property>
        <name>user</name>
        <value>app</value>
      </property>
      <!-- Disable autocommit for connections-->
      <property>
        <name>defaultAutoCommit</name>
        <value>false</value>
      </property>
    </properties>
    ...

在管理控制台中,您可以在数据源配置的属性文本区域中添加 defaultAutoCommit=false 属性:

在 Weblogic 中为 JDBC 数据源设置默认自动提交

It looks like you are not using either Container-managed or Bean-managed transactions. Or, for that matter, you are merely retrieving a connection from a DataSource and then disabling autocommit, without the initial establishment a transaction context; this implies that you are using JDBC transactions (that rely on the transaction manager of the underlying database).

When you use Container or Bean managed transactions, you will no longer have to worry about the autocommit property of a Connection used in a transaction, as the container will ensure that the autocommit property is set to false, before returning the Connection to the application.

If you need to use Container-managed transactions, you'll need to use EJBs. Any transaction associated with an EJB will commit automatically, unless a RuntimeException or an ApplicationException is thrown.
If you need to use Bean-managed or programmatic transactions, you will have to use the UserTransaction API.

If you are using an ORM framework like Hibernate that is responsible for establishing connections, then you ought to remember that it is Hibernate that is responsible for switching off the autocommit property of the Connection. and in most cases, it would switch off the property.

If you intend to use JDBC transactions, despite the better alternative of JTA transactions, then you could attempt to set the defaultAutoCommit property for the driver, from either Admin Console, or in the JDBC configuration file of the Datasource. The snippet of the JDBC configuration file is shown below:

<?xml version='1.0' encoding='UTF-8'?>
<jdbc-data-source xmlns="http://xmlns.oracle.com/weblogic/jdbc-data-source" xmlns:sec="http://xmlns.oracle.com/weblogic/security" xmlns:wls="http://xmlns.oracle.com/weblogic/security/wls" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/weblogic/jdbc-data-source http://xmlns.oracle.com/weblogic/jdbc-data-source/1.0/jdbc-data-source.xsd">
  <name>JDBC Data Source-Oracle</name>
  <jdbc-driver-params>
    <url>jdbc:oracle:thin:@localhost:1521:oracle</url>
    <driver-name>oracle.jdbc.OracleDriver</driver-name>
    <properties>
      <property>
        <name>user</name>
        <value>app</value>
      </property>
      <!-- Disable autocommit for connections-->
      <property>
        <name>defaultAutoCommit</name>
        <value>false</value>
      </property>
    </properties>
    ...

In the Administration Console, you may add the defaultAutoCommit=false property in the Properties textarea of the DataSource configuration:

Set defaultAutocommit for JDBC Datasource in Weblogic

守望孤独 2024-12-13 06:16:32

当您调用connection.close()方法时,App Server上连接池内配置的连接并没有真正关闭,它们实际上返回到连接池中,并可供应用程序使用下一个请求对象。不确定数据源连接池是否会跟踪返回到池的连接上是否有未提交的更改并对其执行自动提交或回滚?

The connections configured inside of a connection pool on the App Server are not really closed when you call the connection.close() method, they are actually returned back to the connection pool, and can be used by the next requesting object. Not sure if the DataSource connection pools will track if there are uncommitted changes on a connection being returned to the pool and perform an auto commit or rollback on it?

独夜无伴 2024-12-13 06:16:32

将 autoCommit 设置为 false 是正确的做法。

我所知道的所有 RDBMS 都会在最后提交事务,除非显式回滚。您看到不同的行为吗?如果您怀疑出现问题,一种选择是打开数据库服务器中的日志记录,您可以在其中看到提交请求。恐怕我不知道如何在 Oracle 中做到这一点。

登录应用程序服务器可能没有用,因为它也可能不会发出显式提交

Setting autoCommit to false is the right thing to do.

All RDBMS that I know of commit the transaction at the end unless explicitly rolled back. Do you see a different behavior? If you suspect something is wrong, one option is to turn on logging in the database server, where you would be able to see the commit request. I am afraid I don't know how to do it in Oracle.

Logging in app server may not be useful because it too may not be issuing explicit commit

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文