2015-09-23 2 views
1

Что произойдет, если я сделаю connection.setAutoCommit(false); Это создает новую транзакцию со стороны базы данных?Что происходит при подключении.setAutoCommit = false

+0

вот хорошее объяснение относительно 'commit' – nafas

+0

@nafas Вам не удалось добавить ссылку? – eatSleepCode

+0

no Идея, как мне удалось ее пропустить: http://dba.stackexchange.com/questions/4252/do-inserts-get-auto-committed – nafas

ответ

2

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

Изменение режима автоматической фиксации через connection.setAutoCommit() неявно совершает активную транзакцию и создает новую. От Javadocs:

ПРИМЕЧАНИЕ. Если этот метод вызывается во время транзакции и изменяется режим автоматической фиксации, транзакция фиксируется. Если вызывается setAutoCommit, и режим автоматической фиксации не изменяется, вызов не работает.

+0

'connection.commit()' завершает транзакцию, но мне любопытно узнать когда транзакция начнется? – eatSleepCode

+1

Фактически, изменение режима автоматической фиксации создает новую транзакцию. Я изменил свой ответ. –

+0

@MickMnemonic, что это значит: «Если вызывается setAutoCommit, и режим автоматической фиксации не изменяется, вызов не работает». –

0

В JavaDocs обеспечить хорошее объяснение этого случая использования в Using Transactions Section

Отключение автоматической фиксации режима

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

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

con.setAutoCommit(false);

0

Реализация каждого метода внутри JDBC API, зависит от каждого драйвера. Oracle может делать что-то совсем другое, чем MySql.

Однако только вызов connection.setAutoCommit(false); не создает транзакции. Это означает, что любое заявление, созданное с использованием этого соединения, будет передаваться вместе, когда вы вызываете connection.commit();.

Посмотрите на this Учебник по Oracle.

+0

Мне просто интересно узнать, поэтому транзакция начинается со стороны базы данных при выполнении первого оператора? – eatSleepCode

+0

Ну, это зависит от водителя. У каждого поставщика может быть другое поведение. Я не знаю, с чего начинается транзакция, но, насколько мне известно, это не имеет значения, потому что все реализации должны полностью заполнить требования JDBC API. – jfcorugedo

Смежные вопросы