• MySQL-TCL语言-transaction control language事务控制语言


    事务基础

    概述

    概念
    事务是数据库管理系统(DBMS)执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。
    事务 = 一个或一组sql语句组成一个执行单元;这个执行单元要么全部执行,要么全部不执行。
    每一个mysql语句是相互依赖的。

    两个关键点
    第一个,它是数据库最小的工作单元,是不可以再分的;
    第二个,它可能包含了一个或者一系列的 DML 语句(database manipulation language),包括 insert delete update。 (单条 DDL(database define language)和 DQL(database query language)也会有事务)

    使用事务原因
    当一个业务流程涉及多个表的操作的时候,我们希望它们要么是全部成功的,要么都不成功,这时会启用事务。

    案例

    # 要求张三丰给郭襄转账500
    表
    张三丰    1000
    郭襄       1000
    
    updateset  张三丰的余额=500  where name = ‘张三丰’;
    updateset  郭襄的余额=1500 where name = ‘郭襄’;
    
    当出现语句1执行成功,但是由于某些原因,语句2没有得到执行。这样就会导致一个问题,张三丰的钱少了,但是并没有将其转给郭襄。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    存储引擎

    概念
    在mysql中的数据用各种不同的技术存储在文件(或内存)中,又称存储引擎称为表类型。

    存储引擎查看

    show engines;
    # 查看mysql支持的存储引擎。
    
    • 1
    • 2

    常见存储引擎
    Innodb、myisam、memory等。
    其中innodb支持事务,而myisam、memory等不支持事务。
    故innodb是默认存储引擎。

    事务的ACID属性

    • 原子性(atomicity)
      原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
      实现:
      可以用 undo log 回滚日志来保证,回滚日志会记录当前事务的反向操作;
      当事务执行过程中出现异常时,就会触发回滚,执行 undo log 日志的回滚操作,将数据恢复到事务开始执行前的状态。

    • 一致性(consistency)
      事务必须使数据库从一个一致性状态变换到另一个一致性状态。
      实现:
      原子性和隔离性保证了数据库的一致性。

    • 隔离性(isolation)
      事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能相互干扰。
      实现:
      如果没有了隔离性,就可能会造成脏读、不可重复读和幻读的问题。所以事务与事务之间需要存在一定的隔离性,可以通过各种锁来实现。
      其次,事务有四个隔离级别,分别是:读未提交、读提交(Oracle 默认)、可重复读(MySQL 默认)和串行化。

    • 持久性(durability)
      持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永远性的,接下来的其他操作和数据库故障不应该对其有任何影响。
      实现:
      由 redo log (重做日志)以及 WAL(Write-Ahead Logging:先写日志再写磁盘) 技术来实现的。
      当有一个更新数据的事务提交之后;InnoDB 存储引擎会先把更新的操作写到 redo log 日志里,并同时将数据更新到内存中(这里就是更新完成了),之后就是等待 InnoDB 将数据持久化到磁盘了。而如果在这等待的过程中,数据库发生异常重启了,也就是数据还没有被持久化到磁盘, 那这个时候就可以根据 redo log 将数据重新恢复到内存中,直到被持久化到磁盘中。

    事务创建

    事务的分类

    隐式(自动)事务

    • 含义
      事务没有明显的开启和结束的标记,比如insert、update、delete语句 。

    • 案例

    delete fromwhere id = 1 ;
    
    • 1
    • 启动方式查询
    show variables like ‘autocommit’;
    
    • 1

    显式事务

    • 含义
      事务具有明显的开启和结束的标记

    • 前提
      必须先设置自动提交功能为禁用。

    • 关闭事务自动提交功能

    set autocommit = 0
    • 1
    • 关闭事务指着对当前的事务有效。

    显式事务具体操作步骤

    ①开启事务
    set autocommit = 0;
    start transaction; # 可以省略
    
    ② 编写事务中的逻辑sql语句(select insert update delete)
    语句1;
    语句2......
    设置回滚点:savepoint 回滚点名;
    
    ③ 结束事务
    commit; 提交事务
    rollback; 回滚事务
    rollback to 回滚点名; 回滚到指定的地方;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    案例
    在这里插入图片描述

    事务的并发问题

    事务的并发问题 = 多个事务 同时 操作 同一个数据库的相同数据。

    同时运行多个事务,当它们访问数据库中相同的数据时,如果没有采取必要的隔离机制,则会导致各种并发问题。

    问题介绍如下:

    • 脏读:
      两个事务T1和T2,T2更新但还没有提交的字段,T1读取了。若此时T2回滚,则T1读取到的就是临时且无效的。
      (一个事务读取了其他事务没有提交的数据,读到的是其他事务“更新”的数据)
    • 不可重复读:
      两个事务T1和T2,T1读取字段内容,之后T2更新了字段内容,T1再读取同一个字段,此时值不同。
      (一个事务多次读取,结果不一样)
    • 幻读:
      两个事务T1和T2,T1从一个表中读取一个字段,然后T2在该表中插入了新的行,之后T1再读同一个表,就会多出几行。
      (一个事务读取了其他事务没有提交的数据,只是读到的是其他事务“插入”的数据)

    数据库事务的隔离性

    概述

    • 数据库系统必须具有隔离并发运行各个事务的能力,使它们不会相互影响,避免各种并发问题。

    • 一个事务与其他事务隔离的程度称为隔离级别。
      数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性约弱。

    • 事务的隔离级别
      oracle
      两种:read committed(默认)、serlalizable
      mysql
      四种:read uncommitted、read committed、repeatable read、serializable

    隔离级别描述脏读不可重复读幻读
    read uncommitted
    读未提交数据
    允许事务读取未被其他事务提交的变更。
    脏读、不可重复读和幻读问题都会出现。
    read committed
    读已提交数据
    只允许事务读取已经被其他事务提交的变更。
    不可重复读 和 幻读问题会出现
    repeatable read
    可重复读数据
    确保事务可以多次从一个字段中读取相同的值,在此事务执行期间,禁止其他事务对这个字段进行更新。
    幻读问题会出现
    serializable
    串行化
    确保事务可以从一个表中读取相同的行,在事务持续期间,禁止其他事务对该表执行插入、更新和删除的操作。
    无问题存在

    事务隔离级别演示

    • 连接数据库
      在这里插入图片描述
    • 查看当前的默认隔离级别
    每启动一个mysql程序,就会获取一个单独的数据库链接;
    每个数据库链接都有一个全局变量@@tx_isolation,标识当前的事务隔离级别。
    查看当前的隔离级别:select @@tx_isolation;
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    • 设置当前mysql连接的隔离级别
    set [session] transaction isolation level 隔离级别;
    
    • 1

    在这里插入图片描述

    • 设置数据库系统的全局隔离级别
    set global transaction isolation level 隔离级别;
    
    • 1

    事务的状态

    状态名说明
    活动状态事务对应的数据库操作正在执行
    局部提交状态事务的最后一个语句执行之后,但是还未写到磁盘中
    失败状态当事务处于活动或部分提交,出错无法继续执行,或人为停止当前事务提交
    中止状态回滚后的状态
    提交状态部分提交状态的事务将修改的数据写到磁盘之后。

    中止 和 提交状态 才是事务最终的状态。

    回滚点

    语法

    savepoint 节点名;
    # 设置保存点,就是一个标识符位置
    # 需要搭配 
    rollback to 节点名;
    
    • 1
    • 2
    • 3
    • 4

    案例

    在这里插入图片描述
    在这里插入图片描述

    delete 和 truncate 事务 区别

    区别deletetruncate
    说明使用delete删除表格,再使用rollback回滚
    此时表格并没有被删除
    使用truncate删除表格,再使用rollback回滚
    此时表格被删除
  • 相关阅读:
    SpringBoot读取.yml配置文件最常见的两种方式-源码及其在nacos的应用
    Java ByteArrayOutputStream类简介说明
    手把手安装Origin软件
    海外游戏代投需要注意的
    【Rust日报】2022-06-28 RustExplorer - 自带10000个crate的Rust在线运行环境
    什么样的leader,是一个好leader!
    C#面向抽象编程第二讲
    前端缓存汇总
    下一代 IDE 工具 JetBrains Fleet 正式公测
    设计模式 --单例模式
  • 原文地址:https://blog.csdn.net/LXMXHJ/article/details/126097596