mysql中 SET autocommit=0 与 START TRANSACTION 的区别

在MySQL中, SET autocommit=0;指事务非自动提交,自此句命令执行以后,每个SQL语句或者语句块所在的事务都需要显式调用commit才能提交事务。

  • 不管autocommit1还是0 :

    START TRANSACTION + commit数据才会生效,ROLLBACK会回滚。

  • autocommit0 时:

    有没有START TRANSACTION都没关系。

    只有当commit数据才会生效,ROLLBACK会回滚。

  • autocommit1时 ,如果没有START TRANSACTION, 调用ROLLBACK没有用的, 即便设置了SAVEPOINT。 也就是说, 必须设置START TRANSACTION才能回滚。

代码演示之前, 我们先建个table:

USE `test`;
CREATE TABLE `autocommit_trans`(
    `id` INT unsigned NOT NULL AUTO_INCREMENT,
    `user_name` varchar(20) NOT NULL,
    PRIMARY KEY(`id`)
) ENGINE=InnoDB;
INSERT INTO `autocommit_trans`(`id`, `user_name`)VALUES(1, 'aben'),(2, 'sky');
  1. SET autocommit=1 + START TRANSACTION: 回滚成功
SET autocommit =1;

DROP PROCEDURE IF EXISTS  `sp_autocommit1_trans`;
DELIMITER $$
CREATE  PROCEDURE `sp_autocommit1_trans`()
BEGIN
    -- 错误代码
    DECLARE err_code INTEGER DEFAULT 0;
    -- 如果sql执行异常, 或者警告, 或者数据不存在, 都设置错误代码为1
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND  SET err_code=1;

    START TRANSACTION;
    SAVEPOINT p1;  -- 设置埋点

    UPDATE `autocommit_trans` SET `user_name` = 'aben2' WHERE `id` =1; 
    UPDATE `autocommit_trans` SET `gender` = 'female' WHERE `id` =2; -- 栏位不存在, SQL错误
    UPDATE `autocommit_trans` SET `user_name` = 'john' WHERE `id` =3; -- 记录不存在

    IF err_code = 1 THEN 
        ROLLBACK to p1; -- 回滚到埋点 p1
    ELSE 
        COMMIT; 
    END IF;

END$$
DELIMITER ;

CALL `test`.`sp_autocommit1_trans`();

回滚成功

  1. SET autocommit=0 + START TRANSACTION: 回滚成功
SET autocommit =0;

DROP PROCEDURE IF EXISTS  `sp_autocommit0_trans`;
DELIMITER $$
CREATE  PROCEDURE `sp_autocommit0_trans`()
BEGIN
    -- 错误代码
    DECLARE err_code INTEGER DEFAULT 0;
    -- 如果sql执行异常, 或者警告, 或者数据不存在, 都设置错误代码为1
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND  SET err_code=1;

    START TRANSACTION;
    SAVEPOINT p1;  -- 设置埋点

    UPDATE `autocommit_trans` SET `user_name` = 'aben2' WHERE `id` =1; 
    UPDATE `autocommit_trans` SET `gender` = 'female' WHERE `id` =2; -- 栏位不存在, SQL错误
    UPDATE `autocommit_trans` SET `user_name` = 'john' WHERE `id` =3; -- 记录不存在

    IF err_code = 1 THEN 
        ROLLBACK to p1; -- 回滚到埋点 p1
    ELSE 
        COMMIT; 
    END IF;

END$$
DELIMITER ;

CALL `test`.`sp_autocommit0_trans`();

回滚成功

  1. SET autocommit=0 , 没有START TRANSACTION: 回滚成功
SET autocommit =0;

DROP PROCEDURE IF EXISTS  `sp_autocommit0_notrans`;
DELIMITER $$
CREATE  PROCEDURE `sp_autocommit0_notrans`()
BEGIN
    -- 错误代码
    DECLARE err_code INTEGER DEFAULT 0;
    -- 如果sql执行异常, 或者警告, 或者数据不存在, 都设置错误代码为1
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND  SET err_code=1;

    -- START TRANSACTION; -- 这里没有哦!
    SAVEPOINT p1;  -- 设置埋点

    UPDATE `autocommit_trans` SET `user_name` = 'aben2' WHERE `id` =1; 
    UPDATE `autocommit_trans` SET `gender` = 'female' WHERE `id` =2; -- 栏位不存在, SQL错误
    UPDATE `autocommit_trans` SET `user_name` = 'john' WHERE `id` =3; -- 记录不存在

    IF err_code = 1 THEN 
        ROLLBACK to p1; -- 回滚到埋点 p1
    ELSE 
        COMMIT; 
    END IF;

END$$
DELIMITER ;

CALL `test`.`sp_autocommit0_notrans`();

回滚成功

  1. SET autocommit=1 , 没有START TRANSACTION: 即使有埋点, 也无法回滚
SET autocommit =1;

DROP PROCEDURE IF EXISTS  `sp_autocommit1_notrans`;
DELIMITER $$
CREATE  PROCEDURE `sp_autocommit1_notrans`()
BEGIN
    -- 错误代码
    DECLARE err_code INTEGER DEFAULT 0;
    -- 如果sql执行异常, 或者警告, 或者数据不存在, 都设置错误代码为1
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND  SET err_code=1;

    -- START TRANSACTION; -- 这里没有哦!
    SAVEPOINT p1;  -- 设置埋点

    UPDATE `autocommit_trans` SET `user_name` = 'aben2' WHERE `id` =1; 
    UPDATE `autocommit_trans` SET `gender` = 'female' WHERE `id` =2; -- 栏位不存在, SQL错误
    UPDATE `autocommit_trans` SET `user_name` = 'john' WHERE `id` =3; -- 记录不存在

    IF err_code = 1 THEN
        ROLLBACK to p1; -- 回滚到埋点p1
    ELSE 
        COMMIT; 
    END IF;

END$$
DELIMITER ;

CALL `test`.`sp_autocommit1_notrans`();

回滚失败, 我们可以从结果中看到数据已经被修改:

每种情况的演示代码执行后, " SELECT * FROM autocommit_trans "即可确认是否回滚.

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值