【发布时间】:2016-11-24 11:14:18
【问题描述】:
我写了一个存储过程,并在开头放了这些语句:
SET autocommit = 0;
START TRANSACTION READ WRITE;
我以COMMIT; 声明结束。
但交易不工作。
你能帮忙吗?
更新 1:
这个指令可以吗
SET @now = unix_timestamp () * 1000;
导致隐式提交?
更新2:我的代码是这样的
CREATE PROCEDURE stored_proc()
SQL SECURITY DEFINER
BEGIN
SET autocommit = 0;
START TRANSACTION;
DELETE FROM `TABLE1` WHERE `COLUMN1` = value;
INSERT INTO TABLE1...
SET @now = unix_timestamp() * 1000;
DELETE FROM TABLE2 WHERE COLUMN2 = value;
INSERT INTO `TABLE2` ...;
COMMIT;
END
我有一个显示表 TABLE2 数据的 ihm。我注意到当存储过程运行时,IHM 显示空值。这意味着提交是在第二次 DELETE 之后和 INSERT 之前进行的
更新 3
select @@tx_isolation; 在结果末尾给我REPEATABLE-READ 和show create table table2给我engine = InnoDB
【问题讨论】:
-
你在使用 InnoDB 吗? MyISAM 不实现事务。
-
是的,我正在使用 innodb。
-
当你说它“不工作”时会发生什么,你怎么知道它不工作?您在更新中的代码不会导致隐式提交,例如任何 ddl 代码(如
alter table)都会这样做。你应该添加你的整个过程(你可以缩写,确切的代码是不相关的,例如只写select ...)并描述(没有)发生什么以及你期望什么。顺便说一句,您不需要使用set autocommit = 0来启动事务,start transaction用于启动事务。commit不会将autocommit重置为 1,因此从现在开始您将需要commit。 -
有人可以帮忙吗?
-
感谢您的更新,现在您的要求更清楚了。如果您使用 MyISAM 表(不支持事务)或隔离级别设置得太低,则应该会发生这种行为。尝试:
show create table table2,然后在输出的末尾查找类似engine = MyISAM或engine = InnoDB的内容。要查看您的隔离级别,请使用select @@tx_isolation;
标签: mysql transactions