mysql 基础

MySQL ACID、事物隔离、锁、SQL优化

ACID 是数据库事务的一组属性,旨在即使在发生错误、电源故障等情况下也能保证数据有效性。
在数据库环境中,一系列满足 ACID 属性的数据库操作(可以视作对数据的单个逻辑操作)称为事务。
1)Atomicity 原子性:最小工作单元
涉及功能模块(autocommit设置、commit、Rollback语句)
2)Consistency 一致性:即使崩溃异常,数据总是从一个状态到另一个状态
(InnoDB双写缓冲区、InnoDB崩溃恢复区)
3)隔离性(Isolation)防止多个事物并发执行导致事物不一致,分为不同的隔离级别
(事物自动提交autocommit,set transaction Isolation level)
4)持久性(durability)事物一旦提交,所修改的数据就会永久保存到数据库中,

读现象问题:多个事物交叉执行导致的数据不一致情况,
脏读:一个事物能看到其他未提交的修改
不可重复读:一个事物两次查询返回结果不同(解决:加锁读、多版本控制)
幻读:一个事物查询结果返回两个不同得结果集

隔离级别:保证多事物并发数据读写正确

读未提交(READ UNCOMMITTED)

一个事务能够看到其它事务尚未提交的修改,这是最低的隔离水平,允许脏读出现。
这个级别会导致很多问题,从性能上来说,也不会比其它级别好太多,但却缺乏其它级别的很多好处,实际应用中很少使用。

读已提交(READ COMMITTED)

事务能够看到的数据都是其它事务已经提交的修改,也就是保证不会看到任何中间性状态,因此不会出现脏读问题。
但读已提交仍然是比较低的隔离级别,并不保证再次读取时能够获取同样的数据,也就是允许其它事务并发修改数据,允许不可重复读和幻读出现:
同一事务中的一致性读取(Consistent read)总是会设置和读取自己的新快照(snapshot),因此会产生不可重复读问题,因为其它事务可能会并发修改数据。
对于加锁读、UPDATE、DELETE 语句,InnoDB 仅锁定匹配的索引记录。由于禁用了 gap lock,因此会产生幻读问题,因为其它事务可以在间隙(gap)中插入新行。

可重复读(REPEATABLE READ)

这是 MySQL InnoDB 存储引擎默认的隔离级别。

同一事务中的一致性读取(Consistent read)总是会读取第一次读取时建立的快照(snapshot)。
这意味着如果你在同一事务中发起多个普通(非锁定) SELECT 语句,其查询结果是相互一致的。
一致性读取机制保证了同一事务中多次读取的数据是一致的,避免了不可重复读问题,不管其它事务是否提交了 INSERT、DELETE、UPDATE 操作。
如果想每次 SELECT 都返回最新快照,要么隔离级别降为 READ COMMITTED,要么使用加锁读。
对于加锁读、UPDATE、DELETE 语句,加锁行为取决于语句是使用具有唯一搜索条件的唯一索引还是范围类型的搜索条件:
对于具有唯一搜索条件的唯一索引, InnoDB 仅锁定匹配的索引记录。

串行化(SERIALIZABLE)

并发事务之间是串行化的,通常意味着读取需要获取共享读锁,更新需要获取排他写锁,
如果 SQL 使用 WHERE 语句,还会获取 gap lock 和 next-key lock,可能导致大量的超时和锁争用的问题。
这是最高的隔离级别,实际应用中很少使用,只有在非常需要确保数据一致性而且可以接受没有并发的情况下,才会考虑。

附加: MVCC
MVCC 是“多版本并发控制”的缩写。此技术允许具有特定隔离级别的 InnoDB 事务执行一致性读取。
这是一项增强并发性的强大技术,允许并发查询,而无需等待其它事务释放持有的锁。
这项技术在数据库世界中并不普遍。其它一些数据库产品以及 MySQL 存储引擎并不支持。

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

推荐阅读更多精彩内容

  • 基础模块 1. MySQL执行一条查询语句的内部执行过程 客户端先通过连接器连接到MySQL服务器; 连接器权限验...
    Yangzhe12阅读 252评论 0 0
  • 读锁 同一时刻不同线程可读,不可写 写锁 同一时刻不同线程不可读,不可写 锁粒度 表锁 锁定整张表,开销最小。al...
    阿长_一个程序员阅读 209评论 0 0
  • MySql高性能笔记 - (一)Mysql基础知识 1. 读写锁:### 读锁 - 共享锁:互相不阻塞的。多个客户...
    黎明你好阅读 618评论 0 50
  • Mysql 5.7之后都会有默认的root密码:通过grep "temporary password" /var/...
    杜崇铭阅读 354评论 0 0
  • 原文链接:http://blog.csdn.net/qq_22329521/article/details/538...
    越长越圆阅读 830评论 3 16