Koe*_*box 17 mysql transactions rollback
考虑以下:
START TRANSACTION;
BEGIN;
INSERT INTO prp_property1 (module_name,environment_name,NAME,VALUE) VALUES ('','production','','300000');
/** Assume there is syntax error SQL here...**/
Blah blah blah
DELETE FROM prp_property1 WHERE environment_name = 'production';
COMMIT TRANSACTION;
Run Code Online (Sandbox Code Playgroud)
题:
我注意到事务自动回滚并且记录插入尝试失败.
如果我没有提供错误处理程序或错误检查以及ROLLBACK TRANSACTION
如上所述,它是否安全,因为它似乎在上面的例子中执行工作,因为COMMIT TRANSACTION
永远不会执行?
我假设事务立即回滚并在发生错误时立即丢弃.
Mar*_*rkR 24
不,一旦发生错误,事务就不会回滚.但您可能正在使用应用此策略的客户端应用程序.
例如,如果您使用的是mysql命令行客户端,那么它通常会在发生错误时停止执行并退出.在事务正在进行时退出确实会导致它回滚.
在编写自己的应用程序时,可以在回滚时控制策略,但也有一些例外:
除了这些条件之外,如果您调用生成错误的命令,则会正常返回错误,您可以随意执行任何操作,包括无论如何都要提交事务.
使用Mysql存储过程
BEGIN
DECLARE exit handler for sqlexception
BEGIN
ROLLBACK;
END;
DECLARE exit handler for sqlwarning
BEGIN
ROLLBACK;
END;
START TRANSACTION;
INSERT INTO prp_property1 (module_name,environment_name,NAME,VALUE) VALUES ('','production','','300000');
[ERROR]
COMMIT;
END
Run Code Online (Sandbox Code Playgroud)
您可以设置是否警告或错误回滚,然后您不需要删除,使用事务将删除所有条目.
我想补充@MarkR 已经说过的内容。错误处理,假设 InnoDB 引擎,发生在Mysql Server 文档中
- 如果表空间中的文件空间不足,则会发生 MySQL Table is full 错误并且 InnoDB 回滚 SQL 语句。
- 事务死锁导致 InnoDB 回滚整个事务。
- 重复键错误回滚 SQL 语句
- 行太长错误回滚 SQL 语句。
- 其他错误大多由 MySQL 代码层(InnoDB 存储引擎级别以上)检测,并回滚相应的 SQL 语句
我的理解也是,当 Mysql 会话结束时(当 php 脚本结束时),任何未提交的内容都会回滚。我还必须找到一个真正可靠的来源来支持这个声明,所以不要相信我的话。