Автоматическая фиксация транзакций, если явно не зафиксировано или откат - PullRequest
2 голосов
/ 23 сентября 2011

мы используем сервер Weblogic и всегда устанавливаем для autoCommit значение false при подключении к Oracle 10g.

Я хочу знать, есть ли в Weblogic параметр, в котором он будет автоматически фиксировать транзакции, если в коде приложения явно не вызывается Commit или Rollback. Я слышал, что подобная настройка существует в Websphere.

Ответы [ 3 ]

5 голосов
/ 23 сентября 2011

Похоже, вы не используете транзакции, управляемые контейнером или бином. Или, в этом отношении, вы просто извлекаете соединение из DataSource и затем отключаете autocommit, без первоначального установления контекста транзакции; это означает, что вы используете транзакции JDBC (которые зависят от менеджера транзакций базовой базы данных).

Когда вы используете управляемые контейнером или бином транзакции, вам больше не придется беспокоиться о свойстве Connection *1006*, используемом в транзакции, поскольку контейнер гарантирует, что для свойства autocommit установлено значение false перед возвратом Connection в приложение.

Если вам нужно использовать транзакции, управляемые контейнером, вам нужно использовать EJB. Любая транзакция, связанная с EJB, будет совершаться автоматически, если только не выброшено RuntimeException или ApplicationException. Если вам нужно использовать управляемые Бином или программные транзакции, вам придется использовать UserTransaction API.

Если вы используете среду ORM, например Hibernate, которая отвечает за установление соединений, то вам следует помнить, что именно Hibernate отвечает за отключение свойства autocommit для Connection. и в большинстве случаев это отключило бы свойство.

Если вы намереваетесь использовать транзакции JDBC, несмотря на лучшую альтернативу транзакций JTA, вы можете попытаться установить свойство defaultAutoCommit для драйвера из консоли администратора или из файла конфигурации JDBC источника данных. Фрагмент файла конфигурации 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 в текстовой области Свойства конфигурации источника данных:

Set defaultAutocommit for JDBC Datasource in Weblogic

1 голос
/ 27 июня 2012

Соединения, настроенные внутри пула соединений на сервере приложений, на самом деле не закрываются при вызове метода connection.close(), они фактически возвращаются обратно в пул соединений и могут использоваться следующим запрашивающим объектом. Не уверены, что пулы соединений DataSource будут отслеживать наличие незафиксированных изменений в соединении, возвращаемом в пул, и выполнять автоматическую фиксацию или откат для него?

0 голосов
/ 23 сентября 2011

Установка autoCommit в false - правильная вещь.

Все известные мне СУБД фиксируют транзакцию в конце, если явно не откатаны.Вы видите другое поведение?Если вы подозреваете, что что-то не так, один из вариантов - включить регистрацию на сервере базы данных, где вы сможете увидеть запрос на фиксацию.Боюсь, я не знаю, как это сделать в Oracle.

Вход в систему на сервере приложений может оказаться бесполезным, поскольку он также может не выдавать явный коммит

...