MySQL数据库精讲:一文讲解MySQL事务隔离!

事务就是一组数据库操作要么全部成功,要么全部失败。

事务的四大特性:ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性)

MySQL中事务支持是在引擎层实现的,而MySQL的原生MyISAM引擎就不支持事务,所以被InnoDB取代。

隔离性与隔离级别

数据库中多个事务同时执行时,可能出现以下问题:

  • 脏读:读取到其他事务未提交的数据;
  • 不可重复读:读取到其他事物已提交的数据,即本次事务多次读取的数据不一致;
  • 幻读:本次事务修改后又被其它事务改回去,误以为本次修改未生效。

为了解决这些问题,SQL标准规定了以下四个事务隔离级别;隔离得越严实,效率就会越低。。

  • 读未提交:一个事务还未提交时,它做的变更就能被别的事务看到;隔离级别最低,会导致脏读、幻读以及不可重复读。
  • 读提交:一个事务提交之后,它做的变更才会被其他事务看到;避免了脏读,但仍会导致幻读和不可重复读。
  • 可重复读:一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的;能够避免脏读和不可重复读,但仍会导致幻读。
  • 串行化:对于同一行记录读写都会加锁,当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行;能够避免以上三个问题,但执行效率最低。

下面通过举例事务A/B说明这四种事务隔离级别:

  • 如果隔离级别是读未提交:那么V1、V2、V3的值为2;虽然事务B还未提交,但结果已被事务A看到了。
  • 如果隔离级别是读提交:那么V1的值为1,V2、V3的值为2;只有在事务B提交后,V2才能读取到变更的值2。
  • 如果隔离级别是可重复读:那么V1、V2的值为1,V3的值为2;即无论事务B是否提交,事务A在执行期间看到的数据前后必须是一致的。
  • 如果隔离级别是串行化:那么事务A在查询到值后便会加读锁,直到事务A提交(释放读锁)后,事务B才能查询到结果并修改(增加读写锁);所以V1、V2都是1,V3是2。

InnoDB的事务隔离实现

MySQL的默认隔离级别为可重复读,并且还解决了幻读问题;下面我们来讨论可重复读。

MVCC多版本并发控制

在InnoDB中给每行增加两个字段来实现MVCC,分别是创建的事务版本号和删除的版本号,每开启一个事务,事务的版本号就会递增。

  • SELECT:创建版本号<=当前版本号 AND (删除版本号 IS NULL OR 删除版本号 > 当前版本号)
  • INSERT:将当前事务版本号保存至新行的创建版本号
  • UPDATE:新插入一行,并且将当前事务版本号作为新行的创建版本号;将原纪录行的删除版本号设置为当前事务版本号
  • DELETE:将当前事务版本号保存至该行的删除版本号

快照读/当前读、一致性非锁定读/锁定读

  • 快照读:读取的是快照版本,也就是历史版本。
  • 当前读:读取的是最新版本。
  • 一致性非锁定读:不会给它所访问的表加任何形式的锁,其它事务可以同时并发的修改它们。
  • 锁定读:SELECT ... LOCK IN SHARE MODE 给记录添加共享锁,其它事务只能读取不能修改;SELECT ... FOR UPDATE给索引记录加锁,加锁情况桶UPDATE。

在MySQL默认的可重复读中,普通的SELECT是一致性非锁定的快照读,读取的是事务创建时的快照;而UPDATE、DELETE、INSERT、SELECT ... LOCK IN SHARE MODE、SELECT ... FOR UPDATE是锁定的当前读。假设当前事务执行了锁定的当前读,那么其它事务将不能进行修改直到当前事务提交。

长事务

事务在提交之前会保留回滚记录,导致大量占用存储空间,并且还会占用锁资源,所以尽量避免使用长事务;如果无法避免,应保证逻辑日志空间足够用,并且支持动态日志空间增长。监控Innodb_trx表,发现长事务报警。

# 链接 Java程序员福利"常用资料分享"

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,386评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,142评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,704评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,702评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,716评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,573评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,314评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,230评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,680评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,873评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,991评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,706评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,329评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,910评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,038评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,158评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,941评论 2 355

推荐阅读更多精彩内容