all*_*nos 9 mysql transactions rollback
在mysql innodb事务中,我希望重复键错误导致回滚.它没有,而是简单地抛出错误并继续下一个命令.一旦达到COMMIT命令,将提交事务,没有重复键引发命令.
这是预期的行为吗?如果是这样,那么如何进行设置以便在发生此类错误时回滚事务而不是提交事务?
测试环境:
CREATE TABLE `test` (
`id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
BEGIN;
INSERT INTO test VALUES (5);
INSERT INTO test VALUES (5);
COMMIT;
Run Code Online (Sandbox Code Playgroud)
预期结果:表格test为空
实际结果:table test包含一个值为5的记录
如果插入因重复而失败,则数据库将事务回滚到该语句的开头.
它使用在语句开头创建的内部保存点,然后回滚到该保存点.
它不会回滚整个事务,因为这可能不是您想要的.
可以使用命令行参数配置mysql客户端的行为.它可以退出(可以隐式回滚)或继续.
如果您使用自己的应用程序,它的作用取决于您.
Mysql不会对你如何处理失败施加POLICY - 它会将其留给你的应用程序.所以你对他们所做的就是你自己的事业 - 如果你愿意,你可以忽略它们.
小智 3
如果发生错误,MySql(和其他 SQL 引擎 AFAIK)不会自动回滚事务。
您必须声明一个错误处理程序来回滚事务:
DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND
BEGIN
ROLLBACK;
CALL ERROR_ROLLBACK_OCCURRED;
END;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3399 次 |
| 最近记录: |