2013-06-06 4 views
7

Везде, где я выгляжу, кажется, что хранимые процедуры MySQL могут выполнять транзакции. Тем не менее, когда я заявляю о своей хранимую функциюКод ошибки: 1422. Явная или неявная фиксация не разрешена в хранимой функции или триггере

create function test(a int) 
returns int 
MODIFIES SQL DATA 
BEGIN 
    START TRANSACTION ; 
    update t set col='some value' where id=a ; 
    COMMIT ; 
    return 0 ; 
END // 

я

Код ошибки: 1422. Явное или неявное фиксации не допускается в хранимой функции или триггера.

ответ

10

На самом деле вам не разрешены операции внутри хранящихся функции. Разрешены операции внутри хранимых процедуры только.

create procedure test(a int) 
MODIFIES SQL DATA 
BEGIN 
    START TRANSACTION ; 
    update t set col='some value' where id=a ; 
    COMMIT ; 
END // 

Для возврата значений из SP используйте выходные параметры или используйте набор результатов из последнего оператора select в SP.

+6

Также стоит отметить, что если вы вызовете процедуру из триггера, вы по-прежнему будете вознаграждены «ошибка или неявная фиксация не допускается при сохранении функции или триггера». Разочарование. – aroth

+0

эй, это немного устарело, но сейчас я сталкиваюсь с этой проблемой. Есть ли способ обойти это? – user2223059