• 事务


    1.事务基本介绍

    事务不是一个实实在在存在的个体,是一个抽象的概念

    (1)概念

    如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败

     

     这里面包含多个步骤,如果这多个步骤没有被事务管理的话,执行的到第二步出现了异常了,下面的操作不会再执行了,这时候造成的影响是,张三账号减少了500,但是李四的账号并没有加上500

     如果这多个步骤被事务管理了后,这三个操作就变成了一个整体,这样,在第二步出现了异常,就进行回滚。

     等到三个步骤都执行完了,就提交事务。

    将一组SQL放在一个批次中去执行
    InnoDB支持事务

    (2)操作

    开启事务:start transaction;

    回滚:rollback;

    提交:commit;

    (3)MySQL数据库中事务默认自动提交

    一条DML(增删改)语句会自动提交一次事务。

    • 事务提交的两种方式:

      自动提交:mysql就是自动提交的。一条DML(增删改)语句会自动提交一次事务(如果不开启事务的话,就是自动提交;开启事务START TRANSACTION,就要COMMIT)。

      手动提交:需要先开启事务,再提交

    但是ORACLE数据库是默认手动提交的。

    • 修改事务的默认提交方式:select @@autocommit ; -- 1 代表自动提交 0 -- 代表手动提交
    • 查看事务的默认提交方式:set @@autocommit=0 ;

    当修改成手动提交后,如果不提交(COMMIT),就不会持久化。

    例子:

     当我把修改成手动提交,如果没有COMMIT; 上面的UPDATE执行后,表中的记录不会改变即默认的自动回滚)。只有执行了COMMIT; 这句话,表中的记录才会发生改变。

     

    自动提交,一条DML语句就是自动提交

    UPDATE account1 SET balance = 1000;

    	-- mysql是默认开启事务自动提交的
    	SET autocommit = 0 /* 关闭 */
    	SET autocommit = 1 /* 开启(默认的) */
    	-- 手动处理事务
    	SET autocommit = 0 -- 关闭自动提交
    	-- 事务开启
    	START TRANSACTION -- 标记一个事务的开始,从这个之后的sql都在同一个事务内
    	 
    	insert xxx
    	insert xxx
    	-- 提交: 持久化
    	COMMIT
    	-- 回滚:回到原来的样子
    	ROLLBACK
    	-- 事务结束
    	SET autocommit = 1 -- 事务结束,开启自动提交
    	 
    	-- 了解
    	SAVEPOINT 保存点名称 -- 设置一个事务的保存点
    	ROLLBACK TO SAVEPOINT 保存点名称 -- 回滚到某个保存点
    	RELEASE SAVEPOINT 保存点名称 -- 撤销保存点
    

      模拟场景,转账

    CREATE TABLE account1 (
        id INT PRIMARY KEY AUTO_INCREMENT,
        NAME VARCHAR(10),
        balance DOUBLE
    );
    
    -- 添加数据
    INSERT INTO account1 (NAME, balance) values ('zhangsan', 1000), ('lisi', 1000);
    -- zhangsan给lisi转账500
    -- 0.开启事务
    set autocommit =0; -- 关闭自动提交
    START TRANSACTION;
    -- 1.zhangsan账号 - 500
    UPDATE account1 set balance = balance - 500 where NAME='zhangsan';
    -- 2.lisi账号 + 500
    UPDATE account1 set balance = balance + 500 where NAME='lisi';
    -- 3.提交事务,就被持久化了
    commit;
    ROLLBACK; -- 回滚
    set autocommit = 1;  -- 恢复默认值
    

      

  • 相关阅读:
    docker镜像制作及上传到远端镜像仓库
    mysql索引进阶
    电子商务需要用到香港服务器吗?
    golang module goland 配置代理
    nginx做linux服务时,日志有权限提示没权限(nginx: [emerg] open() "/home/www/log/error.log" failed)
    Yaml 、Json 、Dict 之间的转化
    CodeSmith .NET三层架构模板
    C#获取26个英文字母
    基于PCASClass.js和layui.js的城市三级联动
    MySQL变量的使用
  • 原文地址:https://www.cnblogs.com/GumpYan/p/14098110.html
Copyright © 2020-2023  润新知