MySQL数据库事务的机制【总结】

  • A+
所属分类:MySql教程

这几天面试多次被问到了数据库事务机制、隔离级别、乐不雅锁消极锁类的问题,之前对这些只能说有所懂得,有些概念还逗留在记忆层面,没有懂得,所以答复的不好。后面翻书进修了下,懂得了一些器械,在此做一个记录。

什么是事务?

事务我懂得的是一个完全的营业行动,一个营业行动可能包含多个动作,这个完全的动作就构成一个事务。比较经典的例子是银行转账,A账户转到B账户,须要两个动作:A账户减,B账户加,必须包管这两个动作要么都做,要么都不做。

事务的控制分很多个级别,级其余高低决定隔离的程度,MySQL平分四个级别:

事务具有ACID特点,具体包含:

● 原子性(atomicity):原子性是说事务的弗成瓜分,要么全成功,要么全掉败,弗成部分成功,部分掉败。半途掉败的情况下,须要清除疆场,也就是数据回滚。

● 一致性(consistency):一致性是说事务的最后成果,要包管数据上没有异常。一致性是强调成果,是建立在原子性上实现的,也就是说能包管原子性,那就会有一致性的成果。

MySQL为了机能推敲除了行级锁以外照样别的一种方法,多版本并发控制,这中控制是由存储引擎实现。

● 持久性(durability): 事务提交后会持久化,可以长久保存。

事务隔离级别

● 隔离性(isolation):隔离性是说事务没有提交前对其他事务是弗成见的,事务间数据是隔离的(当然不合级别隔离程度不一样)。

懂得事务的隔离级别之前,须要明白数据读取的几个概念:

● 脏读:就是读到了别人还没提交的数据。

事务傍边的隔离是经由过程两种方法控制:一种是锁的方法,经由过程时光上的挫开达到隔离;另一种是版本控制的方法,记录多个版本达到隔离。

● 可反复读:就是同一个事物内的两次查询,中心假如别人修改了查询内的记录且提交了,对第二次查询是弗成见的,不会出现同笔记录两次查询不一致问题。

● 幻读:就是一个事物内的两次查询,中心假如别人增长了记录并且提交了,第二次查询能查询到的,会出现和第一次记录不一致的现象。

● 查询时:查询当前事务之前存在的记录和本领务创建的记录,且没有被删除的,即:创建版本号<=当前版本号 && (删除版本号为空 || 删除版本号 > 当前版本号)

● 读未提交:这种级别是最低的,A事务的修改没有提交对B事物是可见的,会出现数据的脏读,一般情况下不会用到此种类型。

● 读已提交:A事物的修改提交后才对B可见,这种情况会出现数据的幻读的问题,两次查询的成果不一样。

● 可反复读:是MySQL默认的级别,这种级别事物内的两次查询,中心其他修改了某笔记录,对其他事务是弗成见的,包管了反复查的情况下同笔记录的一致性,然则对于新增的情况其他事务是可见的,所以照样会出现新增幻读的现象。

● 可串行化:事务之间是串行履行的,对查询到的每笔记录都加锁,会出现壅塞的情况,并发情况下会造成严重的机能问题,所以一般也不会用到这种类型。

MySQL数据库事务的机制【总结】

隔离级别一览图

事务的隔离实现

1、锁

MySQL傍边的锁分读锁和写锁,读锁因为是读取数据所以可以多个同时读取同一份数据,具有共享性质;写锁涉及到数据的更改,所以和其他写锁和读锁是相冲突的,具有排他性质。

从锁的粒度上分表级锁和行级锁,表锁一般产生在对表构造的修改或对全表更新的时刻,会壅塞所有对这张表的读写操作;行级锁一般产生在指定记录更新的时刻,只会锁定指定记录。锁的粒度越小并发度越高,能优先行级锁尽量不要表锁,和法度榜样中锁的粒度是一样的原则。

2、多版本并发控制

书中说清楚明了InnoDB一种简单的实现方法,这种方法是采取一笔记录多个版本的方法,每笔记录上增长了两个隐蔽列,一个是创建版本号,一个是删除版本号,每开启一个事务都邑分派一个事务版本号,事务版本号是递增的,事务内操作都邑根据这个版本号比较。具体如下:

● 插入时:记录的创建版本号为当前事务版本号。

● 删除时:更新记录的删除版本号为当前事务版本号。

● 更新时:插入一条新记录,创建版本号为当前事务版本号,同时把原记录删除版本号改为当前事务版本号,代表已经删除。实际上这里的更新相当于删除再加一笔记录。

3、乐不雅锁和消极锁

锁从应用的角度又分消极锁和乐不雅锁,消极锁是持有很消极的立场,认为我查到的数据都有可能被别人修改,所以查询的时刻就把这一批数据锁起来,不让别人操作;乐不雅锁是持有很乐不雅的立场,认为我查到的数据根本弗成能被别人修改,所以查询的时刻不锁住这批数据,修改提交的时刻再确认有没有被别人修改,有种亡羊补牢,为时不晚的意思。

乐不雅锁和消极锁的实现:

● 消极锁可以在数据库层面很简单的解决,应用select ... for update,在查询的时刻就锁定这部分数据。

● 乐不雅锁的实现较消极锁复杂,可以在数据库在一个版本号的列,更新的时刻版本号都+1,以此来确认我查出来的数据后面有没有别人修改,已修改的不更新或法度榜样抛一个异常。

应用乐不雅锁照样消极锁:

从机能的角度推敲乐不雅锁机能更好,在查询到更新这段时光没有锁定操作,然则实现起来没有消极锁简单,可能掉足。所以要推敲的身分是体系的并发高不高?出现冲突的概率有多大年夜?并发高的情况下选用乐不雅锁更好,反之选用消极锁这种简单的方法更好。

推荐mysql视频教程,地址:https://www.php.cn/course/list/51.html

以上就是MySQL数据库事务的机制【总结】的具体内容

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: