我有以下MYSQL查询:
START TRANSACTION;
SELECT sport_id INTO @a FROM sports WHERE sport_id = 2 FOR UPDATE;
UPDATE sports SET sport_name = 'Table Tennis' WHERE sport_id = @a;
if (@a > 1) then
COMMIT;
ELSE
ROLLBACK;
END IF;
问题是它在if语句中返回一个错误:
#1064 – You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘if (@a > 1) then COMMIT’ at line 1
我看过堆栈溢出,有一个answer showing a similar query,用几乎相同的方式编写,但它们使用的是没有@符号的变量.删除我的查询@不能解决问题.
这只是一个使用MYSQL尝试一些事务的测试查询,因此查询看起来有点无意义.我有点卡住了.
最佳答案 MySQL无法识别以关键字IF开头的语句和有效的SQL语句.
IF语句仅在复合语句的上下文中起作用(即,在BEGIN和END之间包含的语句块.目前,复合语句仅在存储程序(存储过程,函数或触发器)的上下文中受支持.
http://dev.mysql.com/doc/refman/5.5/en/begin-end.html
如需测试,请尝试……
DELIMITER //
CREATE PROCEDURE usp_test_transaction()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;
START TRANSACTION;
-- whatever DML operations and SELECT statements you want to perform go here
IF (1=1) THEN
COMMIT;
ELSE
ROLLBACK;
END IF;
END//
DELIMITER ;
CALL usp_test_transaction;
(注意:我在这里并不主张在存储过程中处理事务.我个人的偏好是不要这样做,而是处理更高级别的事务.但上面的例子应该有效;我相信MySQL确实支持调用START TRANSACTION ,存储过程的上下文中的COMMIT和ROLLBACK.)