百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>数据库> MySQL数据库事务的机制【总结】
分享文章到:

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

发布时间:09/01 来源:未知 浏览: 关键词:
这几天面试屡次被问到了数据库事务机制、隔离级别、悲观锁悲不雅锁类的问题,此前对这些只能说有所理解,有些概念还逗留在记忆层面,没有懂得,所以答复的不好。后面翻书学习了下,懂得了一些东西,在此做一个记载。

什么是事务?

事务我懂得的是一个完全的业务行动,一个业务行动大概包括多个动作,这个完全的动作就构成一个事务。比力经典的例子是银行转账,A账户转到B账户,需要两个动作:A账户减,B账户加,必需包管这两个动作要末都做,要末都不做。

事务具有ACID特点,详细包罗:

● 原子性(atomicity):原子性是说事务的不成分割,要末全成功,要末全失败,不成部分成功,部分失败。半途失败的状况下,需要清扫战场,也就是数据回滚。

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

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

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

事务隔离级别

理解事务的隔离级别此前,需要清楚数据读取的几个概念:

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

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

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

事务的操纵分许多个级别,级别的上下决议隔离的程度,MySQL中分四个级别:

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

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

● 可反复读:是MySQL默许的级别,这种级别事物内的两次查询,中心其他修改了某笔记录,对其他事务是不成见的,包管了反复查的状况下同笔记录的一致性,但是关于新增的状况其他事务是可见的,所以还是会显现新增幻读的现象。

● 可串行化:事务之间是串行施行的,对查询到的每笔记录都加锁,会显现堵塞的状况,并发状况下会造成严峻的机能问题,所以一样也不会用到这品种型。

da42ae461bb3beb70330bc07a112817.png

隔离级别一览图

事务的隔离实现

事务傍边的隔离是通过两种方式操纵:一种是锁的方式,通过时间上的挫开到达隔离;另一种是版本操纵的方式,记载多个版本到达隔离。

1、锁

MySQL傍边的锁分读锁和写锁,读锁由于是读取数据所以可以多个同时读取统一份数据,具有同享性质;写锁触及到数据的变更,所以和其他写锁和读锁是相冲突的,具有排他性质。

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

2、多版本并发操纵

MySQL为了机能思考除了行级锁之外还是别的一种方式,多版本并发操纵,这中操纵是由储备引擎实现。

书中说明了InnoDB一种简便的实现方式,这种方式是采纳一笔记录多个版本的方式,每笔记录上增添了两个潜藏列,一个是创立版本号,一个是删除版本号,每开启一个事务都会分配一个事务版本号,事务版本号是递增的,事务内操纵都会按照这个版本号比力。详细如下:

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

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

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

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

3、悲观锁和悲不雅锁

锁从使用的角度又分悲不雅锁和悲观锁,悲不雅锁是持有很悲不雅的态度,认为我查到的数据都有大概被别人修改,所以查询的时候就把这一批数据锁起来,不让别人操纵;悲观锁是持有很悲观的态度,认为我查到的数据根本不成能被别人修改,所以查询的时候不锁住这批数据,修改提交的时候再确定有没有被别人修改,有种贼去关门,为时不晚的意思。

悲观锁和悲不雅锁的实现:

● 悲不雅锁可以在数据库层面很简便的解决,利用select ... for update,在查询的时候就锁定这部分数据。

● 悲观锁的实现较悲不雅锁复杂,可以在数据库在一个版本号的列,更新的时候版本号都+1,以此来确定我查出来的数据后面有没有别人修改,已修改的不更新或程序抛一个非常。

使用悲观锁还是悲不雅锁:

从机能的角度思考悲观锁机能更好,在查询到更新这段时间没有锁定操纵,但是实现起来没有悲不雅锁简便,大概出错。所以要思考的因素是系统的并发高不高?显现冲突的概率有多大?并发高的状况下选用悲观锁更好,反之选用悲不雅锁这种简便的方式更好。

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

以上就是MySQL数据库事务的机制【总结】的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有150人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板