Подтвердить что ты не робот

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

Connection.setTransactionIsolation(int) предупреждает:

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

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

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

4b9b3361

Ответ 1

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

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

Источники:

Ответ 2

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

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

Edit:

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

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

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

con.setAutoCommit(ложь);

Источник: JDBC-транзакции

Ответ 3

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))

Ответ 4

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

Ответ 5

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

Ответ 6

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

  • вы должны создать объект соединения, например con
  • con.setAutoCommit(false);
  • ваши запросы
  • если все верно con.commit();
  • else con.rollback();

Ответ 7

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

 try (Statement statement = conn.createStatement()) {
      statement.execute("BEGIN");
      try {
        // use statement ...
        statement.execute("COMMIT");
      }
      catch (SQLException failure) {
        statement.execute("ROLLBACK");
      }
  }