5

我有以下 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 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'if (@a > 1) then COMMIT' 附近使用正确的语法

我查看了堆栈溢出,并且有一个显示类似查询的答案,以几乎相同的方式编写,但他们使用的变量没有@符号。删除@我的查询并不能解决问题。

这只是一个测试查询,用于使用 MYSQL 尝试一些事务,因此查询似乎有点毫无意义。我有点卡住了。

4

1 回答 1

3

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 在存储过程的上下文中。)

于 2013-04-02T14:18:28.120 回答