Mysql锁、事务隔离级别详解

一、MySQL锁

锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一 个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。
很多人在开发过程中,应该注意到很多锁的问题,在数据库中,有时候我们没有给SQL语句加锁,这些SQL语句也正常的运行,那是因为MySQL自动帮我们加了隐式锁,在某些其他特殊情况,可能会需要我们自己主动加锁。

1、锁分类

在MySQL中,锁机制比较简单,并且不同的存储引擎支持不同的锁机制。

  • MyISAM 存储引擎采用表锁。
  • BDB 存储引擎采用页面锁,也支持表锁。
  • InnoDB 存储引擎即支持表锁,也支持行锁,默认使用行锁。

从性能上分为:悲观锁乐观锁
从数据操作类型上分为:读锁写锁。(都属于悲观锁)
读锁(共享锁):针对同一份数据,多个读操作可以同时进行并且不会相互影响
写锁(排他锁):在写操作完成之前,会阻塞其他写锁和读锁。
从数据操作粒度上分为:表锁行锁

1.1 表锁

每次操作锁住整张表,开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

  • 手动增加表锁:lock table 表名称 read(write),表名称2 read(write);
  • 查看表锁:show open tables;
  • 删除表锁:unlock tables;

1)手动增加表读锁


表锁语句

当前session和其他session都可以读该表


查询结果

当前session中插入或者更新锁定的表都会报错,其他session插入或更新则会等待


更新结果

2)手动增加表写锁


查询结果

更新结果

3)查看表锁情况


查看表锁情况

4)删除表锁


删除表锁

结论:MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行增删改操作前,会自动给涉及的表加写锁。表锁中读锁会阻塞写,但是不会阻塞读;写锁则会阻塞读和写。

1.2 行锁

每次操作锁住一行数据。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度最高。
上面说了,MyISAM 只支持表锁,InnoDB可以支持表锁和行锁,但是,InnoDB只有通过索引条件检索数据才使用行级锁,否则,InnoDB也会走表锁。所以说:InnoDB的行锁是基于表索引的。同时,InnoDB 与 MyISAM 引擎的不同之处还有,InnoDB支持事务

1、行锁支持事务

在并发事务中,可能会带来如下问题:

  • 脏读:事务A读取到了事务B已经修改但尚未提交的数据,还在这个数据基础上做了操作。(针对未提交数据)
  • 不可重复读:事务A读取到了事务B已经提交的修改数据。(针对其他提交前后,读取数据本身的对比)
  • 幻读:事务A读取到了事务B提交的新增数据。(针对其他提交前后,读取数据条数的对比)
  • 更新丢失:当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题–最后的更新覆盖了由其他事务所做的更新。

1) 事务的隔离级别
脏读”、“不可重复读”和“幻读”,其实都是数据库读一致性问题,必须由数 据库提供一定的事务隔离机制来解决。
事务的隔离级别就是通过锁的机制来实现,锁的应用最终导致不同事务的隔离级别,只不过隐藏了加锁细节,事务的隔离级别有4种:

事务隔离级别

数据库的事务隔离越严格,并发副作用越小,但付出的代价也就越大,因为事务隔 离实质上就是使事务在一定程度上“串行化”进行,这显然与“并发”是矛盾的。
mysql默认事务隔离级别为:可重复读(REPEATABLE-READ)

查看mysql事务隔离级别:
5.7版本:
show variables like 'tx_isolation';
8.0版本:
show variables like 'transaction_isolation';

2、行锁分析

通过检查InnoDB_row_lock状态变量来分析系统上的行锁的争夺情况

show status like '%Innodb_row_lock%'
image.png

对各个状态量的说明如下:
Innodb_row_lock_current_waits: 当前正在等待锁定的数量
Innodb_row_lock_time: 从系统启动到现在锁定总时间长度
Innodb_row_lock_time_avg: 每次等待所花平均时间
Innodb_row_lock_time_max: 从系统启动到现在等待最长的一次所花时间
Innodb_row_lock_waits: 系统启动后到现在总共等待的次数

优化建议:

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

推荐阅读更多精彩内容

  • 一、概述 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种...
    不变甄心阅读 2,736评论 0 3
  • 文章导读: 累兮,累兮,要死兮...... 本文解决问题: 1、表级锁定(读锁、写锁) 2、行级锁定(共享锁、排他...
    创造new_world阅读 640评论 0 1
  • 一、简介 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种...
    huangxiongbiao阅读 433评论 0 0
  • 2018年6月8日 星期五 多云 周五的一日,事不多。 晚间和一朋友见面,聊得不错,在一家上海特色餐厅用餐,点了几...
    小筑文心阅读 237评论 0 1
  • 我感觉自己说不上优秀学员,可以说是一个拖后腿的同学,感恩大家以及自己争取到这个分享的机会。 首先说一下我最新的三个...
    龍女茗茶阅读 1,341评论 0 0