MySQL随笔03_事务隔离

一、什么是事务

简单来说,事务就是要保证一组数据操作,要么全部成功,要么全部失败。

在MySQL中,事务支持是在引擎层实现的。MySQL是一个支持多引擎的系统,但并不是所有引擎都支持事务。

二、事务的基本特性

事务的四大基本特性:原子性、一致性、隔离性、持久性,即大名鼎鼎的ACID

原子性(Atomicity)

原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

一致性(Consistency)

一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

隔离性(Isolation)

隔离性是当多个用户并发访问数据库时,比如同时操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

持久性(Durability)

持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

三、隔离性与隔离级别

对于事务的隔离级别,隔离得越严格,效率就会越低。 因此,很多时候需要在二者之前寻找平衡点。

事务隔离级别概念来源

当数据库上有多个事务同时执行时,就可能出现脏读不可重复读幻读的问题,由此产生隔离级别的概念。

读现象
  • 脏读——是指当前事务读取另一个事务修改的数据,但是另一个事务对这些数据做了回滚,或者在提交前再次更新,而这些数据可能被当前事务用户后续的处理中。

    <u>只有在读未提交(READ-UNCOMMITTED)隔离级别下才可能出现脏读。</u>

  • 不可重复读——在一个事务中,前后相同的两次查询,结果应当是一样的,但是查询的返回结果确不一致。

  • 幻读——某一行出现在一次查询的结果集中,但是没有出现在之前该查询的结果集中。

SQL标准的事务隔离级别
  1. 读未提交 指一个事务还没提交时,它做的变更就能被别的事务看到。
  2. 读提交指一个事务提交后,它做的变更才能被其他事务看到。
  3. 可重复读一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。在此隔离级别下,未提交变更对其他事务也是不可见的。
  4. 串行化 对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。 当出现读写冲突时,后访问的事务阻塞,必须等前一个事务执行完成才能继续执行。

假设一个只有一个字段的表T,有一条记录字段值为1。两个事务A、B在不同隔离级别下查询到的值,如下图。

file

file

file

file

在实现上,数据库内部会创建一个视图,访问时以视图的逻辑结果为准。(此视图与我们常规使用的视图不是同一个)

注意点:

  1. 读未提交隔离级别,直接返回记录上最新的值,没有视图的概念。
  2. 串行化隔离级别,直接用加锁的方式避免并行访问可能发生的问题。
MySQL设置隔离级别参数

MySQL配置隔离级别是通过启动参数transaction-isolation来设置的。可选值如下:

  • READ-UNCOMMITTED 读未提交
  • READ-COMMITTED 读提交
  • REPEATABLE-READ 可重复读 (默认值)
  • SERIALIZABLE 串行化

四、事务隔离的实现——MVCC

在MySQL中,每条记录在更新的时候都会同时记录一条回滚操作。记录上最新的值,通过回滚操作,都可以得到前一个状态的值。

在并行的多事务环境下,不同时刻启动的事务有不同的read-view,同一条记录在系统中可以存在多个版本,即数据库的多版本并发控制MVCC

回滚日志清理时机

系统判断当没有事务再需要用到回滚日志时则删除。

当系统中没有比这个回滚日志更早的read-view时,就不需要回滚日志了。

尽量不要使用长事务

使用长事务使得系统中会存在很老的事务视图。由于这些事务随时可能访问数据库里面的任何书籍,所以在该事务提交之前,数据库里它可能用到的回滚记录都必须保留,从而导致大量占用存储空间。除此之外,长事务还占用锁资源,可能拖垮整个库。

即使用长事务可能存在的问题:

  1. 大量占用存储空间
  2. 占用锁资源

五、事务的启动方式

MySQL 事务启动方式:

  1. 显示启动事务语句。 begin/start transaction---->commit/rollback。

  2. set autocommit=0或1,此命令表示将线程的自动提交关闭开启

    autocommit=0 时,执行一个select事务就启动了,但不会自动提交,只有主动执行commitrollback断开连接时才会提交。

    autocommit=1时 (建议设置),用begin显示启动事务,若执行commit则提交事务。

关于”多一次交互“问题

在设置了autocommit=1情况下,对于一个需要频繁使用事务的业务,每一次都多一个begin显示启动事务的交互,可使用commit work and chain语法,表示提交事务并自动开启下一个事务。

  1. 减少交互次数。
  2. 较少再次执行begin语句的开销。

六、小结

file

参考资料:

1、事务隔离级别:为什么你改了我还看不见

2、mysql的事务四个特性以及事务的四个隔离级别

3、MySQL事务(transaction)以及事务隔离级别(isolation level)

4、Mysql参数详解

本文由博客一文多发平台 OpenWrite 发布!

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

推荐阅读更多精彩内容

  • 一、事务概述 我们可以将事务理解为一组sql语句的集合。事务可以只包含一条sql,也可以包含多条sql,事务中所有...
    国球乒乓阅读 363评论 0 0
  • 提到事务,你肯定并不陌生,和数据库打交道的时候,我们总是会用到事务。最经典的例子就是转账,你要给朋友小王转100元...
    allen成阅读 547评论 0 0
  • 事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在 MySQL 中,事务支持是在引擎层实现的。MySQL...
    itczl阅读 1,000评论 0 0
  • 孤村日暮车马稀,家家炊火催肠饥。 老妇村口遥望处,老翁满载还家路。 家书遥寄千万里,难道何时是归期。 花田风柳夕阳...
    夜舞霓裳阅读 65评论 0 1
  • 【日精进打卡第56】 【知~学习】 《六项精进》1遍 共2遍 累计151遍 《大学》1遍 共2遍 累计149遍 【...
    黄于峰阅读 91评论 0 0