Как начать транзакцию в JDBC? - PullRequest
       50

Как начать транзакцию в JDBC?

53 голосов
/ 09 февраля 2011

Connection.setTransactionIsolation(int) предупреждения:

Примечание. Если этот метод вызывается во время транзакции, результат определяется реализацией.

Это поднимает вопрос: как начать транзакцию в JDBC? Понятно, как завершить транзакцию, но не как ее начать.

Если Connection начинается внутри транзакции, как мы должны вызывать Connection.setTransactionIsolation(int) вне транзакции, чтобы избежать поведения, специфичного для реализации?

Ответы [ 7 ]

47 голосов
/ 20 апреля 2011

Отвечая на мой вопрос:

  • Соединения JDBC начинаются с включенным режимом автоматической фиксации, где каждый оператор SQL неявно разграничивается с транзакцией.
  • Пользователи, которые хотят выполнять несколько операторов за транзакцию, должны отключить автоматическую фиксацию .
  • Изменение режима автоматической фиксации запускает фиксацию текущей транзакции (если она активна).
  • Connection.setTransactionIsolation () может быть вызвано в любое время, если включена автоматическая фиксация.
  • Если автоматическая фиксация отключена, Connection.setTransactionIsolation () может вызываться только до или после транзакции. Вызов его в середине транзакции приводит к неопределенному поведению.

Источники:

24 голосов
/ 09 февраля 2011

JDBC неявно разграничивает каждый запрос / обновление, которое вы выполняете для соединения с транзакцией.Вы можете настроить это поведение, вызвав setAutoCommit (false) , чтобы отключить режим автоматической фиксации, и вызвать commit () / rollback () , чтобы указать конец транзакции.Pesudo code

try
{
  con.setAutoCommit(false);

   //1 or more queries or updates

   con.commit();
}
catch(Exception e)
{
   con.rollback();
}
finally
{
   con.close();
}

Теперь в указанном вами методе есть тип.Это должно быть setTransactionIsolation (int level) и не является API для разграничения транзакций.Он управляет тем, как / когда изменения, сделанные одной операцией, становятся видимыми для других параллельных операций, "I" в ACID (http://en.wikipedia.org/wiki/Isolation_(database_systems))

18 голосов
/ 09 февраля 2011

Я предлагаю вам прочитать это , вы увидите

Поэтому первый вызов setAutoCommit (false) и каждый вызов commit () неявно отмечают началосделка.Транзакции могут быть отменены, прежде чем они будут совершены путем вызова

Изменить:

Проверьте официальную документацию по транзакциям JDBC

Когдасоединение создано, оно находится в режиме автоматической фиксации.Это означает, что каждый отдельный оператор SQL рассматривается как транзакция и автоматически фиксируется сразу после его выполнения.(Точнее, по умолчанию оператор SQL фиксируется при его завершении, а не при выполнении. Оператор завершается, когда получены все его результирующие наборы и количество обновлений. Однако почти во всех случаяхоператор завершен и, следовательно, зафиксирован сразу после его выполнения.)

Чтобы разрешить группировке двух или более операторов в транзакцию, необходимо отключить режим автоматической фиксации. Это показано в следующем коде, где con - активное соединение:

con.setAutoCommit (false);

Источник: JDBC Сделки

9 голосов
/ 09 февраля 2011

На самом деле, эта страница из учебника JDBC была бы лучше прочитана.
Вы бы установили соединение, установили уровень изоляции и затем обновили и добавили что-нибудь, а затем либо зафиксировали, либо откатили.

3 голосов
/ 25 ноября 2017

Сначала вы можете запустить транзакцию вручную, если вы хотите оставить соединение в режиме "setAutoCommit (true)", но хотите транзакцию:

 try (Statement statement = conn.createStatement()) {
      statement.execute("BEGIN");
      try {
        // use statement ...
        statement.execute("COMMIT");
      }
      catch (SQLException failure) {
        statement.execute("ROLLBACK");
      }
  }
3 голосов
/ 24 апреля 2016

Может быть, это ответит на ваш вопрос: вы можете иметь только одну транзакцию на соединение.Если автокоммит включен (по умолчанию), каждый выбор, обновление, удаление будет автоматически запускаться и фиксировать (или откатывать) транзакцию.Если вы отключите автокоммит, вы начнете «новую» транзакцию (означает, что фиксация или откат не произойдут автоматически).После некоторых операторов вы можете вызвать commit или rollback, который завершает текущую транзакцию и автоматически запускает новую.Вы не можете иметь две активные транзакции, открытые на одном соединении JDBC на чистом JDBC.

2 голосов
/ 19 июля 2016

Вы можете использовать эти методы для транзакции:

  1. вы должны создать объект подключения, например con
  2. con.setAutoCommit(false);
  3. ваши запросы
  4. если все верно con.commit();
  5. иначе con.rollback();
...