mysql事物及隔离级别(代码片段)

知其黑、受其白 知其黑、受其白     2022-12-02     227

关键词:

阅读目录

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

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

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

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

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

二、事务的四种隔离级别

在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别。我们的数据库锁,也是为了构建这些隔离级别存在的。

隔离级别脏读(Dirty Read)不可重复读(NonRepeatable Read)幻读(Phantom Read)
未提交读(Read uncommitted)可能可能可能
已提交读(Read committed)不可能可能可能
可重复读(Repeatable read)不可能不可能可能
可串行化(Serializable )不可能不可能不可能

未提交读(Read Uncommitted):
允许脏读,也就是可能读取到其他会话中未提交事务修改的数据。

提交读(Read Committed):
只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)

可重复读(RepeatedRead):
可重复读。
在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。
在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读。
mysql默认级别:可重复读

串行读(Serializable):
完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞。

三、事务的并发问题

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

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

3、幻读:
系统管理员 A 将数据库中所有学生的成绩从具体分数改为 ABCDE 等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

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

四、MVCC 在 MySQL 的 InnoDB 中的实现

在InnoDB中,会在每行数据后添加两个额外的隐藏的值来实现MVCC,这两个值一个记录这行数据何时被创建,另外一个记录这行数据何时过期(或者被删除)。

在实际操作中,存储的并不是时间,而是事务的版本号,每开启一个新事务,事务的版本号就会递增。 在可重读 Repeatable reads 事务隔离级别下:

  • SELECT 时,读取创建版本号 <= 当前事务版本号,删除版本号为空或 > 当前事务版本号。
  • INSERT 时,保存当前事务版本号为行的创建版本号。
  • DELETE 时,保存当前事务版本号为行的删除版本号。
  • UPDATE 时,插入一条新纪录,保存当前事务版本号为行创建版本号,同时保存当前事务版本号到原来删除的行。

通过 MVCC,虽然每行记录都需要额外的存储空间,更多的行检查工作以及一些额外的维护工作,但可以减少锁的使用,大多数读操作都不用加锁,读数据操作很简单,性能很好,并且也能保证只会读取到符合标准的行,也只锁住必要行。

我们不管从数据库方面的教课书中学到,还是从网络上看到,大都是上文中事务的四种隔离级别这一模块列出的意思。

MVCC 总结:为了实现快照读(读写不冲突)

五 MySQL 死锁

死锁是只两个或者多个事务在同一个资源上相互占用,并请求锁定对方占用的资源。

从而导致循环的现象。
当多个事务试图以不同的顺序锁定资源时,就可能产生死锁。多个事务同时锁定同一个资源时,也会产生死锁。

例如,两个事务同事处理 stockprice 表。

事务1:
start transaction;
update stockprice set close = 45.50 where stock_id = 4 and date = '2019-05-05';
update stockprice set close = 36.66 where stock_id = 3 and date = '2019-05-06';
commit

事务2:
start transaction;
update stockprice set high = 33.33 where stock_id = 3 and date = '2019-05-06';
update stockprice set high = 35.66 where stock_id = 4 and date = '2019-05-05';
commit
    

如果执行了第一条update 语句,跟新了一行数据,同时也锁定了该行数据,接着每个事务都尝试去执行第二条update语句,发现该行已经被对方锁定,然后两个事务都等待对方释放锁,同事又持有对方需要的锁,则陷入死循环。

除非有外部因素介入才能解除死锁。

六 EXPLAIN 分析语句

1. select_type:查询类型,
    1. simple:一般是简单查询,不使用union或子查询
    2. subquery:子查询中的第一个select
    3. primary:最外层的select
2. type:mysql找到所需行的方式,又叫“访问类型”,由差到好的顺序:
    1. type=ALL:全表扫描(一般需要进行优化)
    2. type=index:整个索引扫描(不满足最左匹配可能会引起)
    3. type=range:使用一个索引来检索给定范围的行
    4. type=ref:mysql会根据特定的算法快速查找到某个符合条件的索引,而不是会对索引中每一个数据都进行一一的扫描判断
    5. type=eq_ref:类似ref,区别是使用的索引是唯一索引
    6. const、system:常量匹配,主键匹配
3. rows:找到所需记录需要读取的行数(估计值)
4. extra:详细信息,常见:
    1. Using index:只查询索引就能得到结果(覆盖索引)
    2. Using where:需要通过索引再检索实际数据进行过滤
    3. Using temporary:使用临时表
    4. Using filesort:使用临时文件排序

七 锁的定义

1.每次总是被什么共享锁、排他锁给绕晕了。
简单实际一点。就只有 读锁 写锁 两种锁。

对应关系如下:

锁类型描述
共享锁(读锁)其他事务可以读,但不能写。
排他锁(写锁)其他事务不能读取,也不能写。

2.乐视锁和悲观锁

乐观锁:是一种解决问题的逻辑。采用版本号的处理方式实现
悲观锁:是借用 mysql InnoDB 行锁来实现的 (where 条件必须要加索引)。

select * from user where id = 10 for update

3.行锁和表锁

行锁:顾名思义就是锁定每一行
表锁:顾名思义就是锁定整张表

4.其他 MySQL 内部实现的锁机制
隐式锁、间隙锁等。

浅谈mysql数据库事物及数据库引擎(代码片段)

浅谈Mysql数据库事物及数据库引擎一、Mysql事物1.事物2事务的ACID特点3Mysql及事物隔离级别1.查询全局事务隔离级别2.查询会话事务隔离级别3.设置全局事务隔离级别4.设置会话事务隔离级别4事物控制语句1创建案例表数据2事物的提... 查看详情

面试官问:mysql锁与事物隔离级别你知道吗?(代码片段)

 前言 前面我们讲了MySQL数据库底层的数据结构与算法、MySQL性能优化篇一些内容。我们再来聊聊MySQL的锁与事务隔离级别,分上下两篇,本篇重点讲MySQL的行锁与事务隔离级别。锁定义锁是计算机协调多个进程或线程并发... 查看详情

mysql读取的记录和我想象的不一致——事物隔离级别和mvcc(代码片段)

本篇是《MySQL是怎样运行的》读书笔记,主要分析并发的事务在运行过程中会出现一些可能引发一致性问题的现象。文章目录1.事务的特性简介1.1原子性(Atomicity)1.2隔离性(Isolation)1.3一致性(Consistency&#x... 查看详情

数据库-事物的隔离级别(代码片段)

定义事物是需要保持一致性的一批语句的集合,一个事物中的语句执行需要一定的时间,在此时间内对待外部变化的策略就是隔离级别.事物的隔离级别有四种:读未提交,读已提交,可重复读,串行化.安全性依次提高,性能依次下降.1.读... 查看详情

mysql读取的记录和我想象的不一致——事物隔离级别和mvcc(代码片段)

本篇是《MySQL是怎样运行的》和《MySQL45讲》的读书笔记,主要分析并发的事务在运行过程中会出现一些可能引发一致性问题的现象。文章目录1.事务的特性简介1.1原子性(Atomicity)1.2隔离性(Isolation)1.3一致性... 查看详情

mysql的事务和引擎,注意细品(代码片段)

...2、数据不一致产生的结果:(三)、事务的隔离1、MySQL事物隔离级别1.1查询全局事务隔离级别1.2查询会话事务隔离级别1.3设置全局事务隔离级别1.4设置会话事务隔离级别(四)事务控制语句1 查看详情

mysql索引事务及存储引擎(代码片段)

...引MySQL事务概念事务的ACID特点事务之间的相互影响MySQL及事物隔离级别查询全局事务隔离级别查询会话事务隔离级别设置全局事务隔离级别设置会话事务隔离级别事务控制语句案例应用测试提交事务测试回滚事务测试多点回滚使... 查看详情

python乐观锁和悲观锁以及事物隔离级别(代码片段)

查看详情

mysql的事务特性,四种隔离级别及原理(代码片段)

一、事务的基本要素(ACID)1、原子性(Atomicity)事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作... 查看详情

mysql默认事务隔离级别引起的重复读问题(代码片段)

...跳出循环方法二是在方法一之前运行的原因分析查看MySQL事物级别:SELECT@@tx_isolation;//mysql8.0以上版本的查 查看详情

mysql默认事务隔离级别引起的重复读问题(代码片段)

...跳出循环方法二是在方法一之前运行的原因分析查看MySQL事物级别:SELECT@@tx_isolation;//mysql8.0以上版本的查 查看详情

mysql--新手必备sql基础知识事务acid及隔离级别(代码片段)

❤️‍您好,我是贾斯汀,本文主要分享数据库的一些基础知识!❤️‍SQL什么是SQL?【百度百科】结构化查询语言(StructuredQueryLanguage)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和... 查看详情

mysql—mysql数据库事务的基本概念以及隔离级别(代码片段)

...细介绍了Mysql数据库事务的基本概念、并发事务的问题、事物的实现原理以及隔离级别。在数据库中,事务是数据库操作的最小逻辑工作单元,一个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机... 查看详情

高性能mysql的事物隔离级别

数据库事务的隔离级别有4种,由低到高分别为Readuncommitted、Readcommitted、Repeatableread、Serializable。而且,在事务的并发操作中可能会出现脏读,不可重复读,幻读。下面通过事例一一阐述它们的概念与联系。Readuncommitted读未提交... 查看详情

我理解的---》mysql事务的四大特性及事务的隔离级别(代码片段)

什么是事务?Transaction常言道:能不麻烦就不麻烦,能简单化就简单化。但是为什么需要事务呢?事务:用来保证一个业务的完整性,最大的优势就是回滚,并撤销正在进行的所有未提交的修改;作... 查看详情

mysql隔离级别容易理解的方法(代码片段)

开始我以为图像会容易理解mysql隔离级别,后面看到这个文章,发现这个代码容易理解了,只是有些部分有小错误,和排版看的不容易,就加以修改转来了关于mysql隔离级别的实验简介SQL定义了四种隔离级别。包括RE... 查看详情

mysql事务隔离级别(代码片段)

...必须满足A(原子性)C(一致性)I(隔离性)D(持久性)原则。其中,隔离性是为了尽量减少并发事务彼此之间的影响,最高的隔离级别可以保证并发事务之间互不影响。  在实际应用过... 查看详情

mysql原理篇之事务隔离级别和mvcc--13(代码片段)

Mysql原理篇之事务隔离级别和MVCC--13事前准备事务隔离级别事务并发执行遇到的问题SQL标准中的四种隔离级别MySQL中支持的四种隔离级别如何设置事务的隔离级别MVCC原理版本链ReadViewREADCOMMITTED——每次读取数据前都生成一个ReadView... 查看详情