MySQL 事务与隔离级别

embedded/2024/9/24 17:51:49/

MySQL 事务

数据库事务指的是一组数据操作,事务内的操作要么就是全部成功,要么就是全部失败,如果部分成功,那么已成功的必须回滚,恢复数据的原始状态。

假设一个网购付款的操作,用户付款后要涉及到订单状态更新、扣库存以及其他一系列动作,这就是一个事务,如果一切正常那就相安无事,一旦中间有某个环节异常,那整个事务就要回滚,总不能更新了订单状态但是不扣库存吧,这问题就大了。

事务具有原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)四个特性,简称 ACID。

一、事务的基本要素(ACID)

1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。

2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。

3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。

4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

二、事务的并发问题

1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

3、幻读:一个事物内多次执行同一条sql,返回的结果集不一样。 比如一条select语句执行两次,第二次返回了第一次查询不存在的数据。

4、丢失修改(Lost to modify): 指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。 例如:事务 1 读取某表中的数据 A=20,事务 2 也读取 A=20,事务 1 修改 A=A-1,事务 2 也修改 A=A-1,最终结果 A=19,事务 1 的修改被丢失。

小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要间隙锁+MVCC

三、事务隔离级别

SQL 标准定义了四种隔离级别,MySQL 全都支持。这四种隔离级别分别是:

  • 读未提交(READ UNCOMMITTED)
  • 读提交 (READ COMMITTED)
  • 可重复读 (REPEATABLE READ)
  • 串行化 (SERIALIZABLE)
    从上往下,隔离强度逐渐增强,性能逐渐变差。采用哪种隔离级别要根据系统需求权衡决定,其中,可重复读是 MySQL 的默认级别。

事务隔离其实就是为了解决上面提到的脏读、不可重复读、幻读这几个问题,下面展示了 4 种隔离级别对这三个问题的解决程度。

隔离级别脏读不可重复度幻读
读未提交可能可能可能
读已提交不可能可能可能
可重复度不可能不可能可能(v5.6以后是不可能)
串行化不可能不可能不可能

v5.6版本以后可重复读级别就解决了幻读问题。

读提交解决了脏读问题,行锁解决了并发更新的问题。并且 MySQL 5.6以后 在可重复读级别解决了幻读问题,是通过行锁和间隙锁的组合 Next-Key 锁实现的。:

To prevent phantoms, InnoDB uses an algorithm called next-key locking that combines index-row locking with gap locking. InnoDB performs row-level locking in such a way that when it searches or scans a table index, it sets shared or exclusive locks on the index records it encounters. Thus, the row-level locks are actually index-record locks. In addition, a next-key lock on an index record also affects the “gap” before the index record. That is, a next-key lock is an index-record lock plus a gap lock on the gap preceding the index record. If one session has a shared or exclusive lock on record R in an index, another session cannot insert a new index record in the gap immediately before R in the index order.

串行化

相当于单线程,后一个事务的执行必须等待前一个事务结束。

打开连个客户端, 回话1执行update语句, 提交之前打开客户端2执行update语句或者select都会提示失败,锁超时。
因为事物1执行后update语句整个表被加上了独占锁,其他事物无法执行任何操作

    #session 1SET autocommit=0;SET transaction isolation level SERIALIZABLE;START TRANSACTION;UPDATE test SET score = 11 WHERE id=10COMMIT#sesssion 2SET autocommit=0;SET session transaction isolation level SERIALIZABLE;START TRANSACTION;UPDATE test SET score = 25 WHERE id=20COMMIT

补充

1、事务隔离级别为读提交时,写数据只会锁住相应的行

2、事务隔离级别为可重复读时,如果检索条件有索引(包括主键索引)的时候,默认加锁方式是next-key 锁;如果检索条件没有索引,更新数据时会锁住整张表。一个间隙被事务加了锁,其他事务是不能在这个间隙插入记录的,这样可以防止幻读。

3、事务隔离级别为串行化时,读写数据都会锁住整张表

4、隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。

5、关于next-key 锁可以参考链接:https://segmentfault.com/a/1190000040198549


http://www.ppmy.cn/embedded/116198.html

相关文章

免费开源微信机器人 教程/文档/开发

API接口的核心 对于小白而言,初看API文档可能是一头雾水的——从哪里看,怎么看,看什么是摆在面前的问题。 删除朋友圈 简要描述: 删除朋友圈 请求URL: http://域名地址/deleteSns 请求方式: POST 请…

牛客小白月赛101

考点为:A题 滑动窗口、B题 栈、C题 找规律、D 差分、E 筛约数。C题可能会卡住,不过手搓几组,或者模拟几组规律就显而易见了 A: 思路: 无论去头还是去尾,最后所留下的数据长度一定为:n - k &am…

C++速通LeetCode中等第9题-合并区间

排序后迭代&#xff0c;遇到符合条件的就删除前一项&#xff0c;合并到后一项。 class Solution { public:vector<vector<int>> merge(vector<vector<int>>& intervals) {int left 0,right 0;sort(intervals.begin(), intervals.end());vector&…

Spring Boot框架在高校心理辅导中的实践

2 相关技术简介 2.1Java技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xff0c;任…

redis集群模式连接

目录 一&#xff1a;背景 二&#xff1a;实现过程 三&#xff1a;总结 一&#xff1a;背景 redis集群通过将数据分散存储在多个主节点上&#xff0c;每个主节点可以有多个从节点进行数据的复制&#xff0c;以此来实现数据的高可用性和负载均衡。在集群模式下&#xff0c;客户…

MongoDB在大数据场景应用

MongoDB 由于其高性能、高可用性和水平扩展能力&#xff0c;在实时应用中有着广泛的应用场景。 1. 实时分析和报告 实时数据聚合&#xff1a;MongoDB 的聚合管道&#xff08;Aggregation Pipeline&#xff09;可以高效地对实时数据进行处理和分析&#xff0c;生成实时报告和仪…

状态模式原理剖析

《状态模式原理剖析》 状态模式&#xff08;State Pattern&#xff09; 是一种行为设计模式&#xff0c;它允许对象在其内部状态改变时改变其行为。换句话说&#xff0c;当对象状态发生变化时&#xff0c;它的行为也会随之变化。 核心思想&#xff1a; 状态模式将对象的不同状…

《一本书讲透Elasticsearch》读书笔记(二)

Elasticsearch集群部署 Elastic Stack集群部署基础知识 Elasticsearch、Logstash、Beats、Kibana全部都支持跨平台部署 集群部署平台及操作系统的选型 可供选择的部署平台包括实体服务器、虚拟机&#xff08;VMWare、OpenStack等&#xff09;​、容器化平台&#xff08;Doc…