2016-05-01 5 views
1

Я хочу знать, является ли хранимая процедура в MySQL чем-то большим, чем последовательность операторов SQL с некоторыми ограничениями (http://dev.mysql.com/doc/refman/5.7/en/stored-program-restrictions.html).Выполнение потока, транзакций и хранимой процедуры MySQL

Есть что-то особенное с транзакциями, DML на таблицах InnoDB и т. Д.?

Насколько я знаю, это не так, потому что я не смог найти противоположного.

Edit:

потока исполнения тоже интересный вопрос.

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

CREATE PROCEDURE someproc() 
    -> BEGIN 
    -> -- exec stmt1 
    -> -- exec stmt2 <--- assume it fails! 
    -> -- exec stmt3 
    -> END// 

Что произойдет, если stmt2 терпит неудачу во время выполнения по какой-то причине?

По моему мнению, изменения stmt2 будут отменены, но изменения stmt1 не будут выполнены, и выполнение процедуры будет остановлено, поэтому stmt3 не будет выполняться.

+1

У вас должна быть причина, почему вы спрашиваете об этом. Это может помочь, если вы сообщите нам, почему вы после этой информации, здесь, похоже, проблема XY. –

ответ

1

Хранимая программа MySQL поддерживает синтаксис за пределами SQL-операторов, таких как объявление переменных, условное разветвление, циклы, курсоры, динамический SQL и т. Д. В этом смысле это больше, чем последовательность SQL-операторов.

В инструкциях DML на таблицах InnoDB или транзакциях в хранимой программе MySQL ничего особенного нет. ПРОЦЕДУРА является самой мягкой с точки зрения разрешенных отпечатков. Существуют некоторые ограничения для ФУНКЦИЙ и ТРИГГЕРОВ (как вы уже нашли). Ограничения в основном проистекают от того, как функции вызываются (как выражение в заявлении, или как триггеры уволят (когда оператор DML выполняется.)


EDIT

Если Обработчик не объявлен чтобы поймать исключение/ошибку, когда ошибка встречается в хранимой ПРОЦЕДУРЕ MySQL, выполнение процедуры прекращается, и ошибка возвращается вызывающему.

Насколько далеко были сделаны или отброшены изменения DML, это зависит от того, являются ли таблицы MyISAM или нет, и автоматическая фиксация включена. или о том, выдается ли COMMIT или ROLLBACK для транзакции. Не имеет значения, выполняется ли инструкция DML в хранимой процедуре или вне процедуры.

0

Хранимая процедура может рассматриваться как группа операторов SQL, выполняемых как одна транзакция.

Характер сделки имеет важное значение при работе с параллелизмом.

Другим преимуществом использования хранимой процедуры является применение контроля доступа к хранимой процедуре.

+0

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

+0

Это зависит от того, какая база данных SQL используется. MySql может потребовать явных команд обработки транзакций в хранимой процедуре. Но Oracle и MS SQL Server этого не делают. Вам не нужно явно запускать транзакцию, это делается автоматически.Вам нужно будет указать конец транзакции с фиксацией (или откатом). –

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