MySQL高级【事务】第十章

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 事务:概述,语法,代码验证,事务的四大特征

事务

概述

数据库的事务(Transaction)是一种机制、一个操作序列,包含了==一组数据库操作命令==。

事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令==要么同时成功,要么同时失败==。

事务是一个不可分割的工作逻辑单元。

这些概念不好理解,接下来举例说明,如下图有一张表

image.gif编辑

张三和李四账户中各有100块钱,现李四需要转换500块钱给张三,具体的转账操作为

    • 第一步:查询李四账户余额
    • 第二步:从李四账户金额 -500
    • 第三步:给张三账户金额 +500

    现在假设在转账过程中第二步完成后出现了异常第三步没有执行,就会造成李四账户金额少了500,而张三金额并没有多500;这样的系统是有问题的。如果解决呢?使用事务可以解决上述问题

    image.gif编辑

    从上图可以看到在转账前开启事务,如果出现了异常回滚事务,三步正常执行就提交事务,这样就可以完美解决问题。

    语法

      • 开启事务
      START TRANSACTION;
      或者  
      BEGIN;
      • image.gif
      • 提交事务

      commit;

      • 回滚事务

      rollback;

      代码验证

        • 环境准备
        DROP TABLE IF EXISTS account;
        -- 创建账户表
        CREATE TABLE account(
            id int PRIMARY KEY auto_increment,
            name varchar(10),
            money double(10,2)
        );
        -- 添加数据
        INSERT INTO account(name,money) values('张三',1000),('李四',1000);
        • image.gif
        • 不加事务演示问题
        -- 转账操作
        -- 1. 查询李四账户金额是否大于500
        -- 2. 李四账户 -500
        UPDATE account set money = money - 500 where name = '李四';
        出现异常了...  -- 此处不是注释,在整体执行时会出问题,后面的sql则不执行
        -- 3. 张三账户 +500
        UPDATE account set money = money + 500 where name = '张三';
        • image.gif整体执行结果肯定会出问题,我们查询账户表中数据,发现李四账户少了500。

        image.gif编辑

        添加事务sql如下:

        -- 开启事务
        BEGIN;
        -- 转账操作
        -- 1. 查询李四账户金额是否大于500
        -- 2. 李四账户 -500
        UPDATE account set money = money - 500 where name = '李四';
        出现异常了...  -- 此处不是注释,在整体执行时会出问题,后面的sql则不执行
        -- 3. 张三账户 +500
        UPDATE account set money = money + 500 where name = '张三';
        -- 提交事务
        COMMIT;
        -- 回滚事务
        ROLLBACK;

        image.gif

        上面sql中的执行成功进选择执行提交事务,而出现问题则执行回滚事务的语句。以后我们肯定不可能这样操作,而是在java中进行操作,在java中可以抓取异常,没出现异常提交事务,出现异常回滚事务。

        事务的四大特征

          • 原子性(Atomicity): 事务是不可分割的最小操作单位,要么同时成功,要么同时失败
          • 一致性(Consistency) :事务完成时,必须使所有的数据都保持一致状态
          • 隔离性(Isolation) :多个事务之间,操作的可见性
          • 持久性(Durability) :事务一旦提交或回滚,它对数据库中的数据的改变就是永久的==说明:==

          mysql中事务是自动提交的。

          也就是说我们不添加事务执行sql语句,语句执行完毕会自动的提交事务。

          可以通过下面语句查询默认提交方式:

          SELECT @@autocommit;

          查询到的结果是1 则表示自动提交,结果是0表示手动提交。当然也可以通过下面语句修改提交方式

          set @@autocommit = 0;

          相关实践学习
          如何在云端创建MySQL数据库
          开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
          全面了解阿里云能为你做什么
          阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
          相关文章
          |
          SQL 存储 缓存
          《MySQL高级篇》七、性能分析工具的使用(慢查询日志 | EXPLAIN | SHOW PROFILING | 视图分析 )(一)
          《MySQL高级篇》七、性能分析工具的使用(慢查询日志 | EXPLAIN | SHOW PROFILING | 视图分析 )
          《MySQL高级篇》七、性能分析工具的使用(慢查询日志 | EXPLAIN | SHOW PROFILING | 视图分析 )(一)
          |
          存储 SQL 缓存
          Mysql数据库高级篇 - Mysql性能优化(2)
          Mysql数据库高级篇 - Mysql性能优化(2)
          |
          SQL 存储 缓存
          Mysql数据库高级篇 - Mysql性能优化(1)
          Mysql数据库高级篇 - Mysql性能优化(1)
          |
          存储 SQL 算法
          《MySQL高级篇》八、索引优化与查询优化(三)
          《MySQL高级篇》八、索引优化与查询优化
          《MySQL高级篇》八、索引优化与查询优化(三)
          |
          SQL 存储 缓存
          《MySQL高级篇》八、索引优化与查询优化(一)
          《MySQL高级篇》八、索引优化与查询优化
          《MySQL高级篇》八、索引优化与查询优化(一)
          |
          SQL 存储 JSON
          《MySQL高级篇》七、性能分析工具的使用(慢查询日志 | EXPLAIN | SHOW PROFILING | 视图分析 )(四)
          《MySQL高级篇》七、性能分析工具的使用(慢查询日志 | EXPLAIN | SHOW PROFILING | 视图分析 )
          《MySQL高级篇》七、性能分析工具的使用(慢查询日志 | EXPLAIN | SHOW PROFILING | 视图分析 )(四)
          |
          存储 SQL 缓存
          《MySQL高级篇》八、索引优化与查询优化(五)
          《MySQL高级篇》八、索引优化与查询优化
          《MySQL高级篇》八、索引优化与查询优化(五)
          |
          SQL 存储 缓存
          《MySQL高级篇》八、索引优化与查询优化(二)
          《MySQL高级篇》八、索引优化与查询优化
          《MySQL高级篇》八、索引优化与查询优化(二)
          |
          SQL 存储 关系型数据库
          《MySQL高级篇》七、性能分析工具的使用(慢查询日志 | EXPLAIN | SHOW PROFILING | 视图分析 )(三)
          《MySQL高级篇》七、性能分析工具的使用(慢查询日志 | EXPLAIN | SHOW PROFILING | 视图分析 )
          《MySQL高级篇》七、性能分析工具的使用(慢查询日志 | EXPLAIN | SHOW PROFILING | 视图分析 )(三)
          |
          SQL 存储 关系型数据库
          《MySQL高级篇》七、性能分析工具的使用(慢查询日志 | EXPLAIN | SHOW PROFILING | 视图分析 )(二)
          《MySQL高级篇》七、性能分析工具的使用(慢查询日志 | EXPLAIN | SHOW PROFILING | 视图分析 )
          《MySQL高级篇》七、性能分析工具的使用(慢查询日志 | EXPLAIN | SHOW PROFILING | 视图分析 )(二)

          热门文章

          最新文章

          下一篇
          无影云桌面