当前位置:网站首页>MySQL:意向共享锁和意向排它锁 | 死锁 | 锁的优化
MySQL:意向共享锁和意向排它锁 | 死锁 | 锁的优化
2022-08-09 04:13:00 【_索伦】
InnoDB表级锁
在绝大部分情况下都应该使用行锁,因为事务和行锁往往是选择InnoDB的理由,但个别情况下也使用表级锁;
1)事务需要更新大部分或全部数据,表又比较大,如果使用默认的行锁,不仅这个事务执行效率低,而且可能造成其他事务长时间等待和锁冲突;
2)事务涉及多个表,比较复杂,很可能引起死锁,造成大量事务回滚。
如:
LOCK TABLE user READ;读锁锁表
LOCK TABLE user WRITE; 写锁锁表
事务执行…
COMMIT/ROLLBACK; 事务提交或者回滚
UNLOCK TABLES; 本身自带提交事务,释放线程占用的所有表锁
意向共享锁 & 意向排它锁
使用表锁的时候,设计一个效率问题:
要获取一张表的共享锁S或排它锁X,最起码得确定,这张表没有被其他事务获取过X锁。
意向锁解决上面的问题:当要获取表的X锁时,不需要再检查表中哪些行锁(X或S)被占用,只需要检查 IS锁和 IX锁即可!
意向共享锁(IS锁):事务计划给记录加行共享锁,事务在给一行记录加共享锁前,必须先取得该表的IS 锁。
意向排他锁(IX锁):事务计划给记录加行排他锁,事务在给一行记录加排他锁前,必须先取得该表的IX 锁。

1、意向锁是由InnoDB存储引擎获取行锁之前自己获取的
2、意向锁之间都是兼容的,不会产生冲突
3、意向锁存在的意义是为了更高效的获取表锁(表格中的X和S指的是表锁,不是行锁!!!)
4、意向锁是表级锁,协调表锁和行锁的共存关系。主要目的是显示事务正在锁定某行或者试图锁定某行。
死锁
MyISAM 表锁是 deadlock free 的, 这是因为 MyISAM 总是一次获得所需的全部锁,要么全部满足,要么等待,因此不会出现死锁。但在 InnoDB 中,除单个 SQL 组成的事务外,锁是逐步获得的,即锁的粒度比较小,这就决定了在 InnoDB 中发生死锁是可能的。
mysql> select * from test_dead_lock where id=1 for update;
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting
transaction

死锁问题一般都是我们自己的应用造成的,和多线程编程的死锁情况相似,大部分都是由于我们多个线程在获取多个锁资源的时候,获取的顺序不同而导致的死锁问题。因此我们应用在对数据库的多个表做更新的时候,不同的代码段,应对这些表按相同的顺序进行更新操作,以防止锁冲突导致死锁问题。
锁的优化建议
1.尽量使用较低的隔离级别
2.设计合理的索引并尽量使用索引访问数据,使加锁更加准确,减少锁冲突的机会提高并发能力
3.选择合理的事务大小,小事务发生锁冲突的概率小
4.不同的程序访问一组表时,应尽量约定以相同的顺序访问各表,对一个表而言,尽可能以固定的顺序存取表中的行。这样可以大大减少死锁的机会
5.尽量用相等条件访问数据,这样可以避免间隙锁对并发插入的影响
6.不要申请超过实际需要的锁级别
7.除非必须,查询时不要显示加锁
边栏推荐
- etcd学习笔记 - 入门
- LeetCode题解—15.三数之和
- MKNetworkKit replacing domain name wrong solution
- 2022年安全员-A证特种作业证考试题库及在线模拟考试
- 【图形学】20 基础纹理(一、单张纹理)
- OpenMLDB + Jupyter Notebook:快速搭建机器学习应用
- 模型包装,答辩吹牛方法论!
- 服务端修改Cookie——跨域cookie发送机——通信加密——异或加密
- 了解CV和RoboMaster视觉组(五)CNN没有不变性?
- If A, B, C, and D process parts, the total number of processed parts is 370. If the number of parts processed by A is 10 more, if the number of parts processed by B is 20 less, if the number of parts
猜你喜欢
随机推荐
gopacket源码分析
(a) 7 classes and objects
查询某时间段获得的积分总积分的大小进行排序
为什么有的时间函数在同一事务内返回的都是同一值?
2022年熔化焊接与热切割考试模拟100题及在线模拟考试
leetcode 5709. 最大升序子数组和
串扰与防护
【Pyspark】udf使用入门
29 机器学习中常常提到的正则化到底是什么意思
30 范数
2022R1快开门式压力容器操作考试模拟100题及在线模拟考试
If A, B, C, and D process parts, the total number of processed parts is 370. If the number of parts processed by A is 10 more, if the number of parts processed by B is 20 less, if the number of parts
项目管理-挣值分析方法学习总结
松柏集(云衣裳)
技术分享 | 使用 cURL 发送请求
简单的数学公式计算
2分钟,带你走完企业经营分析全流程,更有通用分析框架直接套用
31 基本统计概念
Polygon zkEVM Prover
leetcode 1805. 字符串中不同整数的数目









