MySQL 事务
创始人
2024-03-17 03:31:56
0

MySQL提供了许多支持事务的存储引擎,但 InnoDB 现在已经成为推荐使用的存储引擎。而且从 MySQL5.5 版本开始,默认的存储引擎就从 MyISAM 变成了 InnoDB。所以接下来描述的事务都将基于InnoDB存储引擎。

事务的定义

事务是一组SQL语句作为一个工作单元以原子方式进行处理。

ACID特性

事务具有四个特性,分别是原子性、一致性、隔离性、持久性,这四个特性简称ACID特性。

原子性(Atomicity)

一个事务是一个不可分割的工作单元,事务中的所有操作要么全部成功提交,要么全部失败回滚。
事务的原子性是通过undo log来实现的。当事务对数据进行修改时,InnoDB会生成对应的undo log,当事务需要进行回滚时,InnoDB就会根据undo log恢复到事务开始执行之前的状态。

持久性(Durability)

事务一旦提交,事务所做的修改会永久保存在数据库中,此时即使数据库崩溃数据也不会丢失。实际上持久性也分很多不同的级别,有些持久性策略能够提供非常强的安全保障,而有些则未必。
事务的持久性是通过redo log来实现的。当事务提交时,InnoDB会把 redo log 写到磁盘中,如果数据库宕机,恢复后会读取 redo log 中的记录来恢复数据。

隔离性(Isolation)

一个事务的操作不会被其它事务影响。最理想的情况是是一个事务执行完成后再执行另一个事务,但处于性能上的考虑,一般都需要多个事务并发执行,这时就要求事务执行过程中不受到其他并发执行事务的影响。比如不能读取到另一个未提交事务所做的修改。
事务的隔离性是通过MVCC和锁机制来实现,将在之后的文章进行详细介绍。

一致性(Consistency)

事务执行前后,在业务上来看数据都是正确的。比如学生的学号不会有重复,所有账户的总额是不变的。
一致性是事务追求的最终目标,原子性、持久性和隔离性,都是为了保证数据库状态的一致性而存在的。此外,除了数据库层面的保障,一致性的实现也需要应用层面进行保障。

事务并发问题

在并发情况下,MySQL同时读写可能会导致三类问题:脏读、不可重复度和幻读。

脏读

一个事务读取到了另一个事务未提交的数据。

不可重复读

一个事务中两次查询同一条数据,但看到的数据结果不一样。

幻读

一个事务中两次查询某个范围的数据,但查询结果的条数不一样。

事务隔离级别

事务隔离级别越高,并发程度就会越低。

READ UNCOMMITTED(读未提交)

在READ UNCOMMITED级别,存在脏读、不可重复读、幻读问题。从性能上来说不会比其他级别好太多,却缺乏其他级别的很多好处,在实际应用中一般很少使用。此级别不能满足前面提到的隔离性的定义。

READ COMMITTED(读已提交)

在READ COMMITED级别,存在不可重复读、幻读问题。大多数数据库系统的默认隔离级别是READ COMMITED(但MySQL不是)。
REPEATABLE READ(可重复读)
在READ COMMITED级别,存在幻读问题。REPEATABLE READ是MySQL默认的事务隔离级别。

SERIALIZABLE(串行化)

SERIALIZABLE是最高的隔离级别,该级别强制事务按序执行,使不同事务之间不可能产生冲突。实际应用中很少用到这个隔离级别,除非需要严格确保数据安全且可以接受并发性能下降的结果。

隔离级别脏读不可重复读幻读
READ UNCOMMITTED(读未提交)
READ COMMITTED(读已提交)×
REPEATABLE READ(可重复读)××
SERIALIZABLE(串行化)×××

AUTOCOMMIT

默认情况下,MySQL处于自动提交(AUTOCOMMIT)模式。单个DML语句会被隐式包装在一个事务中并在执行成功后立即提交。也可以使用关键字BRGIN或者START TRANSACTION来开始一个多语句的事务。
在当前连接中,可以使用SET命令设置AUTOCOMMIT来启动或禁用自动提交模式。如果设置了AUTOCOMMIT=0,则当前连接总是会处于某个事务中,直到发出COMMIT或者ROLLBACK。
还有一些命令,当在活动的事务中发出时,会导致MySQL在事务的所有语句执行完毕前提交当前事务。这些通常是DDL命令,如ALTER TABLE,但LOCK TABLES和其他一些语句也具有同样的效果。

参考

《高性能MySQL(第4版)》

相关内容

热门资讯

天降甘露嘿嘿哟的歌曲 天降甘露嘿嘿哟的歌曲天降甘露嘿嘿哟的歌曲 平安夜 歌手: 黑鸭子平安夜圣诞夜万籁寂闪金光圣母圣婴...
甄嬛传里面讲的纯元皇后是谁 甄嬛传里面讲的纯元皇后是谁高中历史老师回答您: 甄嬛传只是一部现代历史剧,不要一味的去和真实历史进行...
他没有先“说”,但他 他没有先“说”,但他 你好,问题要描述清楚的,网友看到才会给你一个号的解答,网友的看不懂是什么的问...
有没有好看的种田文,还有要自己... 有没有好看的种田文,还有要自己看过的,不要太复杂身份高贵的,只要暖文,虐文不要!高山牧场,读过,觉得...
牛徒是什么意思? 牛徒是什么意思?牛就是棒,徒就是徒弟,牛徒意思是说你有一个很棒很了不起的徒弟。
一个男的跟你说他家里的所有事情... 一个男的跟你说他家里的所有事情还有他小时候的事?如果不是对你有好感的话,就是把你当值得交往的朋友,再...
建筑工程管理与建设工程管理有什... 建筑工程管理与建设工程管理有什么区别?就是范围不太一样,建设工程范围比较广泛,建筑工程只是其中的一种...
李逵为母报仇连杀4虎,为何在梁... 李逵为母报仇连杀4虎,为何在梁山痛斥此事时,引来众人取笑呢?李逵为母报仇连杀4虎,为何在梁山痛斥此事...
飞刀又见飞刀龙逸最后和谁在一起... 飞刀又见飞刀龙逸最后和谁在一起了《飞刀又见飞刀》水无伤结局和谁在一起揭秘!  《飞刀又见飞刀》中水无...
清西陵有哪些开放 清西陵有哪些开放清西陵有哪些开放目前开放的只有泰陵和崇陵因为现在是旅游淡季,到3月份可能全开(泰陵,...
镜音ハウトゥ 世界征服中的人物... 镜音ハウトゥ 世界征服中的人物和故事rt 喜欢neru很久惹可是到现在都没弄懂世界征服讲了啥OTZ…...
漫威超级英雄毒液是坏人吗 漫威超级英雄毒液是坏人吗毒液是反派,后来变成血清后是超级英雄。
《西瓜视频》无押金红中麻将群@... 微【ab120590】 【mj120590】【tj525555】等风也等你。喜欢打麻将的兄弟姐妹们、...
《字节跳动》微信红中麻将群@... 群主微信:【ab120590】 【mj120590】【tj525555】没有三缺一的无奈,手机上的麻...
(玩家必看)正规红中麻将群@(... 微【ab120590】 【mj120590】【tj525555】广东一元一分红中麻将推倒胡等麻将群,...
揭秘正规红中麻将群@2024已... 微【ab120590】 【mj120590】【tj525555】专业麻将群三年房费全网最低,APP苹...
内幕消息全天24小时红中麻将群... 薇新【ab120590】【mj120590】【tj525555】,最火热的跑得快,红中等等。自助上下...
《微博》靠谱一元一分红中麻将微... 微信一元麻将群群主微【ab120590】 【tj525555】【mj120590】一元一分群内结算,...
寻找科普红中麻将上下分群@20... 微【ab120590】 【mj120590】【tj525555】等风也等你。喜欢打麻将的兄弟姐妹们、...
《普及十款》正规1元1分红中麻... 一元一分麻将群加群主微【ab120590】【tj525555】 【mj120590】等风也等你。喜欢...