• Mysql的事务


    Mysql的事务

    事务的概念

    是一种机制、一个操作序列,包含了一组数据库操作命
    令,并且把所有的命令作为一个整体一起向系统提交或
    撤销操作请求,即这一组数据库命令要么都执行,要么
    都不执行
    
    是一个不可分割的工作逻辑单元,在数据库系统上执行
    并发操作时,事务是最小的控制单元
    
    适用于多用户同时操作的数据库系统的场景,如银行、
    保险公司及证券交易系统等等
    
    通过事务的整体性以保证数据的一致性
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    事务的ACID特点

    ACID,是指在可靠数据库管理系统(DBMS)中

    ■原子性(Atomicity)
    ·事务是一个完整的操作,事务的各元素是不可分的
    ·事务中的所有元素必须作为一个整体提交或回滚
    ·如果事务中的任何元素失败,则整个事务将失败
    ■一致性(Consistency)
    ·当事务完成时,数据必须处于一致状态
    ·在事务开始前,数据库中存储的数据处于一致状态
    ·在正在进行的事务中,数据可能处于不一致的状态
    ·当事务成功完成时,数据必须再次回到已知的一致状态
    ■隔离性(Isolation)
    ·对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务
    ·修改数据的事务可在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据
    ■持久性(Durability)
    ·指不管系统是否发生故障,事务处理的结果都是永久的
    · 一旦事务被提交,事务的效果会被永久地保留在数据库中
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    1、事务是什么?ACID是啥?有什么特性?
    2、事务中请举个列子–一》故障状态–一》数据不一致–一一》导致有哪些后果,这些后果怎么解决?
    一个事务的执行不能被其他事务干扰

    事务之间的相互影响分为几种,分别为

    1、脏读(读取未提交数据):

    脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据,这就是脏读
    案列1
    比如事务B执行过程中修改了数据X,在未提交前,事务A读取了X,而事务B却回滚了,这样事务A就形成了脏读。也就是说,当前事务读到的数据是别的事务想要修改成为的但是没有修改成功的数据。

    2、不可重复读(前后多次读取,数据内容不一致):

    一个事务内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。
    案列
    事务A第一次查询得到一行记录row1,事务B提交修改后,事务A第二次查询得到row1,但列内容发生了变化。
    select from member;
    1 zhangsan20分
    select from Member;
    1 zhangsan30分

    ①、幻读(前后多次读取,数据总量不一致):

    一个事务对一个表中的数据进行了修改,这种修改涉及到表
    中的全部数据行。同时,另一个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么
    ,操作前一个事务的用户会发现表中还有没有修改的数据行,就好象发生了幻觉一样。
    案列
    假设事务A对某些行的内容作了更改,但是还未提交,此时事务B插入了与事务A更改前的记录相同的记录行,并且在事务A提交之前先提交了,而这时,在事务A中查询,会发现好像刚刚的更改对于某些数据未起作用,但其实是事务B刚插入进来的,让用户感觉很魔幻,感觉出现了幻觉,这就叫幻读
    select from member:
    查询到了6条记录
    alter table member change
    select from member;
    查询到了10条记录(更新了6条数据,还有4条数据,我没有更新到)
    ©、丢失更新:两个事务同时读取同一条记录,A先修改记录,B也修改记录(B不知道A修改过),B提交
    数据后B的修改结果覆盖了A的修改结果。
    案列
    A 30->40事务先完成
    B 30->50事务后完成
    B的事务结果会覆盖A的事务结果,最终值为50

    Mysql 及事务隔离级别(四种)

    (1)read uncommitted(未提交读):读取尚未提交的数据:不解决脏读
    允许脏读,其他事务只要修改了数据,即使未提交,本事务也能看到修改后的数据值。也就是可能读取到其他会话中未提交事务修改的数居。
    (2)read committed(提交读):读取已经提交的数据:可以解决脏读
    只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别〈不重复读)。
    (3)repeatable read(可重复度):重读读取:可以解决脏读和不可重复读mysql默认的
    可重复读。无论其他事务是否修改并提交了数据,在这个事务中看到的数据值始终不受其他事务影响
    (4)serializable:串行化:可以解决脏读不可重复读和虚读-相当于锁表
    完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞。
    
    mysql默认的事务处理级别是Fepeatable read,而Oracle和SQL Server是read committed.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    事务隔离级别的作用范围分为两种:
    全局级:对所有的会话有效
    会话级:只对当前的会话有效

    1、查询全局事务隔离级别
    show global variables like '%isolation%';
    SELECT @@global.tx_isolation;
    2、查询会话事务隔离级别
    show session variables like '%isolation%';
    SELECT @@session.tx_isolation;
    SELECT @@tx_isolation;
    3、设置全局事务隔离级别
    set global transaction isolation level read committed;
    4、设置会话事务隔离级别
    set session transaction isolation level read committed;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    MySQL事务默认是自动提交的,当SQL语句提交时事
    务便自动提交
    ■事务控制语句
    BEGIN或START TRANSACTION:显式地开启一个事务。
    
    COMMIT或COMMIT WORK:提交事务,并使已对数据库进行的所有修改变为水久性的。
    
    ROLLBACK或ROLLBACK WORK:回滚会结束用户的事务,并撒销正在进行的所有未提交的修改。
    
    SAVEPOINT S1:使用SAVEPOINT允许在事务中创建一个回滚点,一个事务中可以有多个
    
    SAVEPOINT:"S1"代表回滚点名称。
    
    ROLLBACK TO[SAVEPOINT】SI:把事务回滚到标记点。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    开始事务与提交

    先创建一个新表

    image-20220809170651064

    image-20220809171057103

    image-20220809171255256

    事务回滚

    image-20220809171858194

    创建回滚点

    image-20220809172532369

    image-20220809172705287

    使用set设置控制事务

    在MySQL中,当我们输入命令时,是系统在自动帮我们begin与commit,无需我们手动输入。这是因为MySQL数据库默认设置了自动提交

    #查看Mysql中的AUTOCOMMIT值 
    show variables like 'autocommit';
    
    • 1
    • 2

    image-20220809173235550

    关闭自动提交

    #禁止自动提交(状态为OFF)
    SET AUTOCOMMIT=0; 
    
    • 1
    • 2

    image-20220809173342129

    一号用户

    image-20220809173816455

    二号用户

    image-20220809173945993

    小结:

    如果没有开启自动提交,当前会话连接的mysql的所有操作都会当成一个事务直到你输入rollback|commit;当前事务才算结束。当前事务结束前新的mysql连接时无法读取到任何当前会话的操作结果。

    如果开起了自动提交,mysql会把每个sql语句当成一个事务,然后自动的commit。

    当然无论开启与否,begin; commit|rollback; 都是独立的事务。

    动提交,当前会话连接的mysql的所有操作都会当成一个事务直到你输入rollback|commit;当前事务才算结束。当前事务结束前新的mysql连接时无法读取到任何当前会话的操作结果。

    如果开起了自动提交,mysql会把每个sql语句当成一个事务,然后自动的commit。

    当然无论开启与否,begin; commit|rollback; 都是独立的事务。

  • 相关阅读:
    RabitMQ 发布确认
    【Python面向对象进阶⑥】——元类
    目标检测的yolov3、4、5、6总结
    Vue脚手架的搭建
    【21 基础纹理(二、凹凸映射的理论)】
    java面试小经历
    文件IO(系统IO)
    前端最新面试题(基础模块HTML/CSS/JS篇)
    UEFI实战——显示进度条
    标签分发协议(LDP)
  • 原文地址:https://blog.csdn.net/weixin_68579466/article/details/126336942