Luk*_*uke 5 mysql variables transactions
我有以下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;
Run Code Online (Sandbox Code Playgroud)
问题在于它在if语句中返回错误:
#1064-您的SQL语法有误;检查与您的MySQL服务器版本相对应的手册,以在第1行的'if(@a> 1)then COMMIT'附近使用正确的语法
我看过堆栈溢出,有一个答案显示了类似的查询,以几乎相同的方式编写,但是他们使用的是没有@符号的变量。删除@我的查询不能解决问题。
这只是一个测试查询,用于尝试使用MYSQL进行某些事务,因此为什么查询看起来没有意义。我有点卡住了。
MySQL 不会将以该关键字开头的语句识别IF为有效的 SQL 语句。
该语句仅在复合语句的上下文中起作用(即,括在和IF之间的语句块。目前,复合语句仅在存储程序(存储过程、函数或触发器)的上下文中受支持。)BEGINEND
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;
Run Code Online (Sandbox Code Playgroud)
(注意:我在这里并不是提倡在存储过程内部处理事务。我个人的偏好是不这样做,而是在更高级别处理事务。但是上面的示例应该可行;我相信 MySQL 确实支持调用 START TRANSACTION 、COMMIT 和 ROLLBACK 在存储过程的上下文中。)
| 归档时间: |
|
| 查看次数: |
8594 次 |
| 最近记录: |