2013-09-25 5 views
1

Мой сервер MySQL 5.5 установил autocommit=1.Выполняют ли DML в хранимой процедуре в одной транзакции?

В моей хранимой процедуре имеется несколько DML, но без явного управления транзакциями.

Когда я выдаю call the_procedure() из MySQL CLI (autocommit по-прежнему 1), выполняются ли все процедуры DML в одной транзакции?

Или они запускаются в отдельных транзакциях и вызывают неявное совершение транзакции после каждого DML (из-за автообновления)?

+1

Если они были преднамеренно извращены, MySQL, вероятно, должен вести себя так же, как и большинство других баз данных SQL - транзакции и хранимые процедуры являются ортогональными понятиями - одна транзакция может охватывать несколько подпрограмм, одна подпрограмма может создавать и совершать несколько транзакций. –

ответ

0

Они работают в отдельных транзакциях, если autocommit=1. Предположим, вы определяете

CREATE TABLE test (id int PRIMARY KEY)// 

CREATE PROCEDURE sp_test_trans() 
BEGIN 
    INSERT INTO test (id) VALUES (1); 
    INSERT INTO test (id) VALUES (2); 
    ROLLBACK; 
END// 

Если запустить эту процедуру с autocommit=0, то ROLLBACK отменит вставки. Если вы запустите его с помощью autocommit=1, то ROLLBACK ничего не сделает. Fiddle here.

Другой пример:

CREATE PROCEDURE sp_test_trans_2() 
BEGIN 
    INSERT INTO test (id) VALUES (1); 
    INSERT INTO test (id) VALUES (1); 
END// 

Если запустить эту процедуру с autocommit=0, провал второй вставки вызовет ROLLBACK отменяя первую вставку. Если вы запустите его с помощью autocommit=1, вторая вставка проиграет, но эффекты первой вставки не будут отменены.

1

This удивительно для меня, но:

Хотя MySQL автоматически инициирует транзакцию на вашем имени при выдаче заявления DML, вы должны выдавать явное заявление TRANSACTION START в программе, чтобы отметить начало Ваши транзакции.

Вполне возможно, что хранимая программа может быть запущена в сервере в который автокоммит установлен в TRUE, и путем выдачи явного START заявление TRANSACTION вы убедитесь, что автокоммит не остается включен во время операции. START TRANSACTION также помогает читать , четко определяя сферу действия вашего транзакционного кода .

+0

Спасибо, предлагает ли DML в вызове процедуры работать в одной транзакции? –

0

Испытания, проведенные в следующем SQL Fiddle, показывает, что, явно не обрабатывать транзакции обрабатываются отдельно, когда переменная autocommit является 1 (TRUE).

+1

Спасибо за это, но мой вопрос больше о том, есть ли неявное коммитирование для каждого отдельного DML в процедуре, а не как вызов процедуры в целом. –

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