2012-07-07 3 views
3

Мне нужно использовать транзакцию в моем проекте на MySQL. Но я не уверен, должен ли я использовать mysql_query("SET AUTOCOMMIT=0"); или нет.
Я знаю, что у меня есть 2 варианта:Статус MySQL AUTOCOMMIT при использовании BEGIN и START TRANSACTION

  1. НАЧАТЬ
  2. START TRANSACTION

Кроме того, я слышал, что один из обоих элементов не требуется использования AUTOCOMMIT = 0.
Пожалуйста, помогите мне узнать, когда я должен использовать AUTOCOMMIT = 0 на самом деле, с BEGIN или с START TRANSACTION?

спасибо.

+0

не использовать mysql_ * function –

+0

@Random Я должен сделать это, к сожалению. У меня есть проект со многими строками кодов, написанных таким образом, и их так сложно изменить. –

+0

Но вам приходится сталкиваться с этой трудной работой, чтобы обеспечить безопасность ваших пользователей. –

ответ

9

Как объяснено в the manual:

По умолчанию MySQL работает с autocommit включенного режима. Это означает, что как только вы выполняете инструкцию, которая обновляет (изменяет) таблицу, MySQL сохраняет обновление на диске, чтобы сделать его постоянным. Это изменение нельзя отменить.

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

START TRANSACTION; 
SELECT @A:=SUM(salary) FROM table1 WHERE type=1; 
UPDATE table2 SET [email protected] WHERE type=1; 
COMMIT; 

С START TRANSACTION, автокоммит остается заблокированным до завершения сделки с COMMIT или ROLLBACK. Затем режим автосохранения возвращается в прежнее состояние.

Пособие продолжает говорить:

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

SET autocommit=0; 

После отключения автокоммит режима, установив переменную autocommit нулю, изменения для безопасных для транзакций таблиц (например, для InnoDB или NDBCLUSTER) немедленно не становятся постоянными. Вы должны использовать COMMIT, чтобы сохранить изменения на диске или ROLLBACK, чтобы игнорировать изменения.

autocommit является переменной сеанса и должен быть установлен для каждого сеанса. Чтобы отключить режим автосохранения для каждого нового соединения, см. Описание системной переменной autocommit по адресу Section 5.1.3, “Server System Variables”.

BEGIN и BEGIN WORK поддерживаются как псевдонимы START TRANSACTION для совершения операции. START TRANSACTION является стандартным синтаксисом SQL и является рекомендуемым способом запуска ad-hoc-транзакции.

+0

Спасибо, эггьял. Я видел эту статью на официальном сайте MySQL. Но я видел некоторые статьи, которые говорили, когда мы используем 'BEGIN', нам не нужно устанавливать' AUTOCOMMIT = 0', но когда мы используем 'START TRANSACTION', мы должны это делать. Что касается того, что я сказал, и к этой статье, какова ваша идея? –

+0

@MohammadSaberi: Из руководства видно, что не нужно * устанавливать 'autocommit = 1' при использовании * либо * из' BEGIN' или 'START TRANSACTION'. Однако, если вы не 'SET autocommit = 1', вы должны убедиться, что перед каждой транзакцией вы явно вызываете« START TRANSACTION »или« BEGIN ». – eggyal

+0

@eggyal Вы имеете в виду, что вы ** не ** должны отключать автокоммутацию при использовании 'START TRANSACTION' и/или' BEGIN'? Он будет автоматически отключен? – CMCDragonkai