MySQL事务和隔离

如何理解MySQL的事务?

  • 简单来说就是要保证一组数据库操作,要么全部成功,要么全部失败。MySQL中的事务支持是在引擎层实现的
  • 事务具有原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(Durability)四个特性。

SQL标准的事务隔离级别包括:

  • 读未提交 read-uncommited
  • 读提交  read-commited
  • 可重复读 repeatable read
      一个事务执行过程中看到的数据,总是和这个事务启动时看到的数据是一致的。在可重复读隔离级别下,未提交的变更对其他线程也是不可见的。
  • 串行化  serializable
      对同一行记录,读会加“读锁”,写会加“写锁”,当出现读写冲突时,前后访问的事务必须等前一个事务执行完成,才能继续执行。

查看隔离级别

  • 在MySQL客户端中输入show variables like 'transaction-isolation';,即可查看当前的隔离级别。

MySQL中的2种“视图”

  • 一种是view,是一个用查询语句定义的虚拟表,在调用的时候执行查询语句并生成结果,创建view的语法是create view ...,它的查询方法与表一样。
  • 另一种是consistent read view,它是InnoDB在实现MVCC时用到的一致性视图,用于支持RC(读提交)和RR(可重复读)隔离级别的实现。

InnoDB隔离级别的实现

  • 事务启动时,数据库里会创建一个视图,访问的时候以视图的逻辑结果为准。
  • 可重复读隔离级别下,视图是在事务启动时创建的,整个事务存在期间都用这个视图。
  • 读提交隔离级别下,视图是在每个SQL语句开始执行的时候创建的。
  • 读未提交隔离级别下,直接返回记录上的最新值,没有视图。
  • 串行化隔离级别下,直接用加锁的方式避免并行访问。

可重复读隔离级别的实现

  • 在可重复读隔离级别下,MySQL中每条记录在更新的时候都会记录一条回滚操作。记录上的最新值,通过回滚操作(undo log),都会得到前一状态的值。不同时刻启动的事务有不同的视图,即同一条记录在系统中可以存在多个版本,这就是数据库的MVCC(多版本并发控制)。
  • InnoDB里每个事务都有一个唯一的transaction id,它是事务开始的时候向InnoDB事务系统申请的,按申请顺序严格递增。
  • 而每行数据也都是有多个版本的。每次事务更新数据的时候,都会生成一个新的版本,并把本次事务的transaction id赋值给这个数据版本的事务ID,记为row trx_id。同时旧的数据版本要保留,并且在新的数据版本中,能有信息(undo log)可以直接拿到它。也就是说数据表中的同一行记录,可能存在多个版本(row),每个版本都有自己的row trx_id
  • MVCC的实现,InnoDB为每个事务构造一个数组,用来保存这个事务的启动瞬间,当前所有启动了,但还没提交的事务的ID
  • 一个数据版本,对于一个事务视图来说,除了自己的更新总是可见的以外,还有3种情况:
      1、版本未提交,不可见;
      2、版本已提交,但是是在视图创建后提交的,不可见;
      3、版本已提交,而且是在视图创建前提交的,可见。
    https://blog.csdn.net/syilt/article/details/107647007

基于可重复读隔离的实现,说明为什么尽量不要使用长事务?

  • 长事务意味着系统里面会存在很老的事务视图,由于这些事务随时可能访问数据库里面的任何数据,所以这个事务提交前,数据库里面它可能用到回滚记录都必须保留,这就会导致大量占用存储空间。
  • MySQL5.5及以前版本,回滚日志(undo log)是和“数据字典”一起放在ibdata文件里的,即使长事务最终提交,回滚段被清理,ibdata文件也不会变小。
  • 注意,长事务不是“长连接”。

MySQL事务的启动方式

  • 显示启动,begin;strat transaction;(并不是立即开启,而是执行第一条操作InnoDB表的语句时才是真正开启,提这点主要想说明它影响视图的出现时机;如果想马上启动一个事务,获得一个read view,可以使用start transaction with consistent snap shot;),配套的提交语句commit,回滚语句rollback,commit work and chain提交事务并自动开启下一个事务(节省再次执行begin语句的开销),此时一般是参数autocommit=1的情况。
  • 当set autocommit=0的时候,线程不会自动提交。此时,若只执行一个select语句,事务就已经启动了,并且不会自动提交。直到commit或rollback或断开连接。

长事务查询

  • 查询持续时间超过60s的事务:
    select * from information_schema.innodb_trx where TIME_TO_SET(timediff(now(),trx_started)) > 60;

事务更新时的版本控制逻辑

  • 更新数据都是先读后写,这个读只能是当前读(current read),即读当前的值(不管当前值得row trx_id是否大于本事务,都能读到);读到后会将自己修改后的数据和自己的事务ID赋给新的“当前值”。如果当前记录的行锁被其他事务占用,就需要进入锁等待状态。
  • 除update语句外,select语句如果加锁,也是当前读。有读锁(S锁,共享锁) lock in share mode;,写锁(X锁,排它锁)for update

读提交和可重复读的主要区别

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

推荐阅读更多精彩内容