- 请考虑以下事项:**
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;
- 问题:**
我注意到事务自动回滚,记录插入尝试失败。
如果我没有像上面那样在ROLLBACK TRANSACTION
中提供错误处理程序或错误检查,那么在上面的示例中,由于COMMIT TRANSACTION
从未执行过,它似乎正在执行这项工作,这样安全吗?
我假设事务会立即回滚,并在发生错误时立即丢弃。
6条答案
按热度按时间tkqqtvp11#
不,事务不会在错误发生时立即回滚。但是您可能正在使用应用此策略的客户端应用程序。
例如,如果你使用的是mysql命令行客户端,那么它通常会在出错时停止执行并退出,而在事务正在进行时退出确实会导致事务回滚。
当您编写自己的应用程序时,可以控制回滚策略,但也有一些例外:
除了这些条件之外,如果您调用了一个生成错误的命令,则错误将正常返回,您可以随意执行任何操作,包括提交事务。
0ejtzxu12#
使用Mysql存储过程
您可以设置如果警告或错误回滚,那么您不需要删除,与事务所有条目被删除。
aiazj4mn3#
您可以使用 * 程序 * 来更有效地执行此操作。
Transaction with Stored Procedure in MySQL Server
muk1a3rh4#
我想补充一下@MarkR已经说过的内容。错误处理(假设使用InnoDB引擎)如Mysql Server Documentation中所述
我的理解也是当Mysql会话结束时(当php脚本结束时),任何没有提交的东西都会被回滚。我还需要找到一个真正可靠的来源来支持这一说法,所以不要相信我的话。
dhxwm5r45#
我测试了这三种情况mySQL不会自动回滚。
事务死锁导致InnoDB回滚整个事务。重复键错误回滚SQL语句。行过长错误回滚SQL语句。
只有受影响的记录失败,其余记录将成功,除非应用程序显式调用“rollback”。
k3bvogb16#
Mysql版本为8.x
热门主题有两点
我的参考内容:
默认情况下,MySQL运行时启用了自动提交模式。这意味着,当不在事务中时,每个语句都是原子的,就像它被START TRANSACTION和COMMIT包围一样。您不能使用ROLLBACK来撤消效果;但是,如果在语句执行期间发生错误,则语句将回滚。
要隐式禁用单个语句系列的自动提交模式,请使用START TRANSACTION语句:
使用START TRANSACTION时,自动提交保持禁用状态,直到使用COMMIT或ROLLBACK结束事务。然后,自动提交模式恢复到以前的状态。