【MySQL】事务(中)
作者:mmseoamin日期:2023-12-11

文章目录

  • 事务异常与产出结论
    • 手动提交 和自动提交 对 回滚的区别
    • 事务隔离性理论
      • 如何理解隔离性?
      • MySQL的隔离级别
      • 事务隔离级别的查看
      • 设置隔离级别

        事务异常与产出结论

        【MySQL】事务(中),第1张

        在没有启动事务之前,account表中存在孙权和刘备的数据


        【MySQL】事务(中),第2张

        在启动事务后, 向 account表中 插入 曹操数据

        输入 CTRL \ 终端1中的客户端 崩溃掉

        此时在终端2中 查看 表中数据,发现启动事务后插入的曹操数据没有了

        说明客户端崩溃,MySQL会自动回滚


        手动提交 和自动提交 对 回滚的区别

        【MySQL】事务(中),第3张

        输入 set autocommit=0 将提交方式改变

        再输入 show variables like ‘autocommit’ 查询当前提交方式

        OFF 表示 将 自动提交关闭


        【MySQL】事务(中),第4张

        启动事务之前,account表中 有两个数据

        启动事务之后,删除表中曹操的数据

        在客户端崩溃后,再次查询 发现 数据会 进行了回滚,将曹操的数据恢复回来了


        【MySQL】事务(中),第5张

        输入 show variables like ‘autocommit’ 查询提交方式

        ON 表示 将 自动提交打开


        【MySQL】事务(中),第6张

        在启动事务之前,account表中 存在 孙权 刘备 赵六 三个数据

        在启动事务之后,删除 对应的赵六的数据

        若此时客户端崩溃,则 刘备数据直接丢失了


        所以 autocommit 的 提交方式 是会 影响 单个sql的(由于单个sql 也可看作事务,所以就会可以看作影响事务)

        事务隔离性理论

        如何理解隔离性?

        所有事务都要有执行过程 ,那么在 多个事务 各自执行多个SQL的时候,就有有可能出现相互影响的情况

        比如:你妈妈跟你说 ,那么就别学,要学就学到最好,至于你的学习过程,你妈妈是不关心

        你的学习,对于你妈来说就是原子

        因为在学习过程中,是很容易受到干扰的,所以就需要将你的学习环境隔离开,保证你的学习环境是良好的


        中国是有很多 为中国崛起 奋斗的先烈们,但是这些先烈 是看不到 现在 世界的样子的

        在 很久之前 就已经 因为 某种 原因 过世了

        说明 任何一个人 不一定 要看到 最新的世界,也不一定 要 看到比较老的世界,只要看到在自己生命周期之内的事情即可

        (如:我们无法去未来 世界 感觉, 也无法 回到 清朝 去感觉,只需关心当下世界发生的变化即可)


        出生的时间点不同,死亡的时间点不同,每个人看到的样貌就不一样

        同理 让每一个事务 让其在到来时,看到它所应该看到的数据, 这个过程 称为 隔离性


        再比如: 假设查找比较久,而转账很快, 你的朋友先转账,然后你才去查找

        先转帐,说明转账来到比较早,原子级别上转账 执行就应该在查找前面

        转账 和 查找 两者 事务 同时 进行 ,此时即便 转账做完了 ,你(查找)也不应该看到


        MySQL的隔离级别

        在此主要是简单点介绍下,后面会详细说


        读未提交

        当一个事务 在运行 ,另一个 事务 也在运行,这两个事务 在执行过程之中 就可以看作是 并发在运行

        【MySQL】事务(中),第7张

        输入 select @@tx_isolation 查询隔离级别

        发现是 隔离级别为 读未提交


        【MySQL】事务(中),第8张

        刚开始account表中有两个数据,当终端1启动事务后 进行删除数据

        终端1并没有提交数据,而终端2就可以在表中查到 数据没有了

        当终端1客户端崩溃了,终端2就能把删除的数据进行回滚

        说明一个事务对数据进行修改,另一个事务立马能看到


        读提交

        【MySQL】事务(中),第9张

        刚开始account表中有三个数据,当终端1启动事务后 进行将id值为3的数据name修改为 zhangsan

        终端1并没有提交数据时,终端2查询表中数据没有变化

        当终端1客户端进行提交了,在终端2中 再次查询就可以看到 修改后的数据

        只能当 一个事务 进行 commit 之后, 另一个事务 才能看到修改后的数据


        可重复读

        是MySQL默认的隔离级别

        事务1 将表的数据删除 或 提交,事务2 都是看不到的表的变化 ,直到事务2也提交,才可以看到表的变化

        如:有两个小孩 进行潜水,要想知道对方是否上岸,就需要浮到水面上


        串行化

        事务最高的隔离级别

        必须按照到来的事件顺序,一个一个的执行,执行完了一个才进行下一个

        就可以保证数据的绝对安全

        事务隔离级别的查看

        查看隔离级别共有三种方法


        第一种方法:select @@global.tx_isolation;

        查看全局隔离级别

        (进行更改,会影响后续所有客户端的登录)

        【MySQL】事务(中),第10张

        第二种方法:select @@session.tx_isolation;

        查看 会话 全局隔离级别

        (进行更改,只会影响会话)

        【MySQL】事务(中),第11张

        第三种方法: select @@tx_isolation;

        【MySQL】事务(中),第12张

        第三种方法是第二种方法的简写,两者的作用相同


        设置隔离级别

        SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ

        COMMITTED | REPEATABLE READ | SERIALIZABLE}

        session和global 两者选一个,不要省略

        transaction 称为 事务

        isolation 称为 隔离

        level 称为 级别

        read uncommitted 称为 读未提交

        read committed 称为 读提交

        repeatable read 称为 可重复读

        serializable 称为 串行化


        【MySQL】事务(中),第13张

        在终端1中,将会话的隔离级别 设置为 读 提交


        【MySQL】事务(中),第14张

        输入 select @@global.tx_isolation; 查询全局的隔离级别

        发现全局的隔离级别没有变化


        【MySQL】事务(中),第15张

        输入 select @@session.tx_isolation; 查询会话的隔离级别

        发现会话的隔离级别 变为 读提交


        【MySQL】事务(中),第16张

        在终端2中 查询全局隔离级别和 会话隔离级别

        发现全局隔离级别和会话隔离级别 都是 读未提交 都没有受影响

        说明会话隔离级别 只能影响 当前会话

        (在终端1中修改会话,则会话受到影响,而终端2中的会话不受影响)