MySQL应用技术2 — 事务简介

系列目录

MySQL应用技术1 — MySQL架构简介
MySQL应用技术3 — MVCC
MySQL应用技术4 — 数据类型选择
MySQL应用技术5 — 约束与范式
MySQL应用技术6 — 数据库中的锁
MySQL应用技术7 — 性能优化简析

其实对于事务的概念,想必接触过数据库的同学们多少都有了了解。简单来说表现为一组原子性的SQL语句,或者一个独立的工作单元。在事务内的语句要么全部执行成功,要么全部不执行。

对于事务的定义有如下四个特性:

原子性(Atomicity)

整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

一致性(Consistency)

一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。也就是说:如果事务是并发多个,系统也必须如同串行事务一样操作。其主要特征是保护性和不变性(Preserving an Invariant),以转账案例为例,假设有五个账户,每个账户余额是100元,那么五个账户总额是500元,如果在这个5个账户之间同时发生多个转账,无论并发多少个,比如在A与B账户之间转账5元,在C与D账户之间转账10元,在B与E之间转账15元,五个账户总额也应该还是500元,这就是保护性和不变性。
【个人理解的一致性更多是对使用者的要求,要求我们设计事务范围的时候,要保证整体的一致性。其实我们完全可以把一个扣钱就当一个事务去提交,另一个人加钱当作事务提交,就违背了总额500的状态。所以此处更多的是对事务包含范围的约束】

隔离性(Isolation)

隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。

持久性(Durability)

在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

【对于ACID来说,如果要完整的实现,其实是相当困难的,可以说会大大降低数据库的并发能力。特别是对于其中的隔离性,涉及到的了读操作,而大多数应用来说,并不需要严格的隔离性,大部分读多写少的场景也并不需要读写都串行化。因此便有了四种隔离级别以便于用户进行选择设置,可以更挑选更适合自己应用场景的隔离级别(虽然我从来都没有设置过,都是用InnoDB默认的可重复读)】


下面简单介绍下四种隔离级别:

Read Uncommitted(读未提交)

在读未提交的级别下,所有事务都可以看到其他未提交事务的执行结果,这也被称之为脏读。这个隔离级别很少用于实际应用,因为它的性能并不比其他级别好很多,但却缺乏其他级别的好处。

Read Committed(读已提交)

大多数数据库系统的默认隔离级别都是读已提交(但MySQL不是)。它满足一个事务开始时,只能读取到已经提交的事务所做的修改,避免了上个级别所说的脏读问题。但让有不可重复读的问题,即一个事务中执行两次相同的查询可能得到不同的结果。

Repeatable Read(可重读)

这是MySQL的默认事务隔离级别,它确保了一个事务中多次读取同样数据时得到的结果是一致的(避免了不可重复读)。但理论上仍不能解幻读问题,即读取范围数据时会因别的事务对该范围内数据做了插入而导致两次读取范围数据不一致(第二次会多一行,产生幻行)。InnoDB通过多版本并发控制(MVCC)解决了幻读问题。【下一章会详细介绍MVCC】

Serializable(可串行化)

这是最高的隔离级别。它通过强制事务排序,使之不可能相互冲突,从而避免了幻读问题。简单来说,串行化会在每一行数据上都加锁,所以可能导致大量的超时和锁竞争。只有在非常需要保证数据的一致,并且几乎没有并发的情况,才考虑使用该级别。

【所以这就是为啥我从来不设置,就用默认的。默认的这个隔离级别就可以适用于绝大多数场景,对于业务内极个别需要处理并发操作的场景,可以考虑使用分布式锁来解决,而非设置串行化的隔离级别】


【说道这个隔离级别和竞争这些问题,自然就有绕不开锁的概念,上一章也提到行锁,表锁,读写锁等等。跟多线程并发一样,如果搞不好,也会导致数据库的死锁。如果死锁了可咋整,难道就挂掉吗?其实MySQL有一套超时监测机制,发现如果等待某个锁的时间超过一定的限制,就会回滚当前事务。当然对于比较好的存储引擎,比如说我们经常用的InnoDB(所以为啥用它呢,就是好啊),也具有了循环依赖的检测能力,当发现死锁是由循环依赖导致的时候,会选择持有最少行级排它锁的事务进行回滚。】

至于像数据库中使用的两段锁定协议,行锁、表锁、间隙锁等等也会在后序的章节讲到。
对于显示的加锁,MySQL支持以

SELECT ..... LOCK IN SHARE MODE
SELECT ..... FOR UPDATE

进行显示加共享锁或者排它锁。但这都是在服务器端实现的(服务器端概念:
MySQL应用技术1 — MySQL架构简介),和存储引擎无关。他们有自己的用途,并不能代替事务处理。如果应用需要用到事务,还是应该选择事务型存储引擎
【嗯,选InnoDB】

文中【斜体】部分多为个人理解,不足支持还望指正。

欢迎注明出处及本文链接的转载。

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

推荐阅读更多精彩内容

  • 一、事务 1、事务四要素:ACID 对于事务,我之前的理解是很粗糙的,不就是为了保证操作的原子性么?一般订单系统或...
    张伟科阅读 1,304评论 0 5
  • 为了充分发挥MySQL的性能并顺利地使用,就必须理解其设计。MySQL的灵活性体现在很多方面。例如,你可以通过配置...
    李文文丶阅读 1,170评论 0 4
  • 事务处理 事务处理是数据库中的一个大块头,涉及到数据的完整性与一致性问题,由于mysql存在多种数据存储引擎提供给...
    tanghomvee阅读 739评论 0 0
  • 雨停云敛,夜静星河浅, 月明雾散,城闹大路宽。 水洼映天,北斗银绳秀, 风推白帆,良宵览江南!
    云逸1108阅读 139评论 0 4
  • 一、水库人员安排 今天园山街道四座水库共出动管护人员9人次,安保10人次,巡查车辆:电动车十辆。重点巡查各水库容易...
    水库管养杨蔼龙阅读 94评论 0 0