• Mysql事务


    1.什么是事务

    当后台一个业务操作需要同时添加、更新、删除多张数据库表的时候,需要保证同时成功,或者失败。事务,要么一起成功。要么一起失败。不会出现一个成功一个失败的现象。

    2.事务的DCL
    DCL用来控制数据库的访问,SQL语句执行关键字:

    GRANT:授予访问权限
    REVOKE:撤销访问权限
    COMMIT:提交事务处理
    ROLLBACK:事务处理回退
    SAVEPOINT:设置保存点
    LOCK:对数据库的特定部分进行锁定
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.事务使用
    自动提交

    若不更改其自动提交变量,则系统会自动向数据库提交结果。关闭自动提交之后,只有使用COMMIT命令后,才会提交事务。

    关闭自动提交:SET AUTOCOMMIT = 0;
    查看AUTOCOMMIT值:select @@autocommit;
    
    • 1
    • 2

    初始化事务 开启了一个事务

    START TANSACTION /BEGIN 
    
    • 1

    提交事务 commit

    提交数据,执行COMMIT,数据就会被永久的保存在了数据库中,不可回滚。
    
    • 1

    事务回滚 rollback

    回滚数据,执行ROLLBACK,可以实现数据的回滚,回滚到最近的一次COMMIT之后。
    
    • 1

    设置保存点 savepoint

    使事务回滚到一个指定的位置,必须和ROLLBACK搭配使用,使用方式如下
    savepoint 节点名;#节点名自定
    rollback to 节点名;
    删除事务的保存点
    release savepoint 节点名
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4事务的特性
    每个事务都遵循ACID原则

    A.原子性Atomicity:保证事务不可再分。 事务中的所有元素必须作为一个整体提交或回滚
    C.一致性Consistency:事务提交前后保持数据的一致。事务开始前,数据处于一致状态。事务完成后,
    数据必须再次保持的一致状态。
    I.隔离性Isolation:在一个事务开启的操作中,其他事务不可见。事务是独立的,不以任何方式依赖于
    或影响其他事务。
    D.持久性Durability:事务一旦提交完成后,永久生效。事务完成之后,它对数据库所作的改变是永久性的。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    5.事务安全问题

    在多线程并发中,同时运行多个事务,这些事务访问数据库相同的数据时,如果没有隔离机制,会导致各种线程安全问题

    脏读:读取到了未提交的数据,回滚后读取脏数据

    事务A更新了数据,但是还没提交;事务B就读取到A更新的数据,事务A回滚后,B就看不到更新的数据。

    不可重复读:同一个事务中,相同查询语句查出来的数据不一致

    两个事务 A, B, A读取了一个字段, 然后B更新并提交了该字段后, A再次读取同一个字段, 值就不同了.

    幻读:当前事务对其他事务更改后提交的语句,进行更新,会出现别的事务操作的数据;

    两个事务A,B, A从表中读取了一个字段, 然后B在该表中更新了数据事务完成后, 如果A再次读取同一个表, 就会出现B已经修改的数据

    更新数据包括 insert update delete
    6.事务的隔离级别

    Mysql 支持 4 中事务隔离级别。默认的事务隔离级别为可重复读: REPEATABLE-READ
    读未提交 READ-UNCOMMITTED
    读已提交 READ-COMMITTED
    可重复读 REPEATABLE-READ
    串行化 SERIALIZABLE

    读未提交 read-uncommitted 允许当前事务读取其他事务未提交的数据

    事务A更新了数据,但是还没提交;事务B就读取到A更新的数据,事务A回滚后,B就看不到更新的数据

    存在问题

    脏读、不可重复读、幻读

    读已提交 read-committed 只允许当前事务读取其他事务已提交的数据

    事务A更新数据并完成提交;事务B内部就可以读取到A更新的数据

    存在问题

    不可重复读、幻读

    可重复读 repeatable-read 当前事务可以多次从一个字段读取相同的值

    事务A更新数据并完成提交;在事务B提交之前,其内部无法读取到A更新的数据,只能读取到之前的旧数据。

    存在问题

    幻读

    串行化 serializable 最高的隔离级别,要求事务都串行执行。

    事务A和事务B,事务A在操作数据库时,事务B只能排队等待

    存在问题

    执行效率极低

    查看当前的隔离级别

    select @@tx_isolation;
    
    • 1

    查看全局的隔离级别

    select @@global.tx_isolation;
    
    • 1

    设置当前 MySQL 连接的隔离级别:

     set tx_isolation ='SERIALIZABLE';
    
    • 1

    设置数据库系统全局的隔离级别

    set global tx_isolation ='REPEATABLE-READ';
    
    • 1

    7.锁技术及MVCC
    行级锁 InnoDB的前三个隔离级别是行级锁

    如果客户端1在修改当前表的一条数据,客户端2也要修改将会等待,客户端2如果要对该数据以外行进行修改不用等。

    表级锁 InnoDB 隔离级别是序列化

    将会发生整张表的锁。只要对该表操作都需要等待上一个操作完成。

    共享锁(shared lock),又叫做"读锁"

    读锁是可以共享的,或者说多个读请求可以共享一把锁读数据,不会造成阻塞。

    排他锁(exclusive lock),又叫做"写锁"

    写锁会排斥其他所有获取锁的请求,一直阻塞,直到写入完成释放锁。

    MVCC (Multi-Version Concurrency Control)多版本并发控制机制

    1. MySQL的大多数事务型存储引擎实现的都不是简单的行级锁。基于提升并发性能的考虑,它们一般都同时实现了多版本并发控制(MVCC)。不仅是MySQL,包括Oracle、PostgresQL等其他数据库系统也都实现了MVCC,但各自的实现机制不尽相同,因为MVCC没有一个统一的实现标准。
    2. 可以认为MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁操作,因此开销更低。虽然实现机制有所不同,但大都实现了非阻塞的读操作,写操作也只锁定必要的行。
    3. MVCC的实现,是通过保存数据在某个时间点的快照来实现的。也就是说,不管需要执行多长时间,每个事务看到的数据都是一致的。根据事务开始的时间不同,每个事务对同一张表,同一时刻看到的数据可能是不一样的。

    8.MySQL的存储引擎
    MySQL中常用的四种存储引擎分别是: MyISAM、InnoDB、MEMORY、ARCHIVE。MySQL 5.5版本后默认的存储引擎为InnoDB。

    InnoDB采用MVCC来支持高并发,InnoDB的性能和自动崩溃恢复特性,使得它在非事务型存储的需求中也很流行。 MySQL的默认事务型引擎,也是最重要、使用最广泛的存储引擎。它被设计用来处理大量的短期(short-lived)事务。通过间隙锁(next-key locking)策略防止幻读的出现。间隙锁使得InnoDB不仅仅锁定查询涉及的行,还会对索引中的间隙进行锁定,以防止幻影行的插入。

    存储引擎的作用及优缺点相关网站:https://www.bilibili.com/read/cv16870629
    参考网站:

    事务及MVCC

    https://baijiahao.baidu.com/s?id=1722528612965200674&wfr=spider&for=pc
    https://zhuanlan.zhihu.com/p/365475165
    https://www.cnblogs.com/china-golang/p/16691825.html
    https://www.jianshu.com/p/9b6fb1be954f
    https://www.cnblogs.com/shijiaqi1066/p/3858050.html
    https://blog.51cto.com/haofeiyu/5674846
    https://zhuanlan.zhihu.com/p/499067876

    锁相关

    https://www.jianshu.com/p/081a3e208e32
    https://www.cnblogs.com/xiatc/p/16257953.html
    https://www.jianshu.com/p/191ce4f77725

  • 相关阅读:
    (附源码)springboot养老院系统 毕业设计 645488
    兄弟DCP-7080激光打印机硒鼓清零方法
    LeetCode 0543. 二叉树的直径
    安防监控EasyCVR视频汇聚平台无法接入Ehome5.0是什么原因?该如何解决?
    《算法图解》阅读笔记
    基于XML的Web服务Java接口(JAX-WS)、Jakarta XML Web Services Eclipse 实现
    react-native中ScrollView套ScrollView
    如何使用 Delphi/Lazarus 代码在 FastReport VCL 中生成二维码?
    【进程VS容器VS虚拟机】
    lv6 嵌入式开发-Flappy bird项目(功能实现)
  • 原文地址:https://blog.csdn.net/m0_50176078/article/details/127998458