DROP FUNCTION IF EXISTS my_func;
DELIMITER ||
CREATE FUNCTION my_func(arg_id INT) RETURNS VARCHAR(200)
BEGIN
DECLARE local_id INT;
DECLARE local_name VARCHAR(200);
START TRANSACTION; /* <-- this is allowed */
SELECT id, name
INTO local_id, local_name
FROM table
WHERE id = arg_id
FOR UPDATE;
SELECT my_other_function(local_name) INTO local_name;
UPDATE table SET name = local_name;
COMMIT; /* <-- this is not allowed
and yields an "Explicit or
implicit commit is not
allowed..." error */
RETURN local_name;
END||
DELIMITER ;
Являются ли заявления возврата подразумеваемыми?Как обернуть хранимую функцию mysql в транзакции
Как вы должны обеспечить выполнение определенной функции как транзакции?
Оберните его сделкой?
START TRANSACTION;
SELECT my_func(33); /* <-- no transaction statements inside the function */
COMMIT;
Запустить транзакцию внутри функции и совершить?
SELECT my_func(33); /* <-- contains only the START TRANSACTION line */
COMMIT;
Также я уже исследовал этот вопрос и нашел некоторую информацию, что сказал что-то вдоль линий: «заявления в хранимых функций не гарантируется выполняться в заявленном порядке, который может сделать бинарный лог (и неявно репликации) непоследовательным ".
Вы имеете в виду «Как избежать _implicit_ commit?» Вы можете избежать _explicit_ commit, удалив «commit;». – Ben
Нет, название имеет смешную формулировку, которую я не мог перефразировать. Я спрашиваю, **, если мне нужна фиксация внутри функции, но это недопустимо, каков канонический/рекомендуемый способ достижения той же цели ... что означает весь вызов функции и последующие вызовы функций, выполняемые внутри транзакция? ** –
Я знаю, что сброс COMMIT сделает код действительным, и никаких ошибок не возникнет, но если у меня есть START TRANSACTION без фиксации, он будет автокомментировать по возвращении? Если I SELECT FOR UPDATE будет освобождать строки после окончания функции? Если нет, то когда я вызываю commit вне функции? –