ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

mysql 锁

2022-06-29 17:34:24  阅读:166  来源: 互联网

标签:IX lock innodb mysql table page row


锁是一种很珍贵的资源。锁一定是并发场景下才会出现的。

保证数据的隔离性,一致性。

1.latch

这个锁存在于内存中,用来控制并发访问的,保护的是内存数据结构。他锁住的是并发资源。就是临界区。

就是java和golang中的mutex。

他加锁的对象是线程。持续时间是临界时间。只有读写锁和互斥量。并且没有死锁检测机制,这个是纯粹靠应用程序加锁的顺序保证无死锁。

查看:show engine innodb mutex;

 

2.lock

加锁的对象是事务。

持续的时间是整个事务周期。死锁通过waits-for graph , time out机制控制

存在于lock manager的hashtable中。

分类:

S行级共享锁(lock in share mode)

X行级排它锁(写和当前读)

IS

IX

AI自增锁

相关的信息你可以show engine innodb status\G,找到transaction部分。

innodb_lock_wait_timeout可以调少一点,调到秒级。

s和x就不说了,老生常谈了。主要聊一下下面的三种。

 

对于is和ix。表示下一层级请求的锁的类型。

is表示事务想获得一个表中某几行的共享锁。

ix表示事务想获得一个表中某几行的排它锁。

意向锁都是表锁。意向锁都是为了实现多粒度级别的锁。

举一个例子。

数据库的层级应该是怎么划分的?

 

database     table     page     row

4个层级。

我要对row=1这行加一个x锁。那么从上至下,锁是怎么加的?

database(IX)  table(IX)  page(IX)  row(X)

这时候,我又要对row=2这行加一个X锁。那么database层能不能拿到IX锁?

答案是能,因为IX表示的是下一层级的锁,也就是IX是table的锁,database本身没有锁。而到了table层级,他持有的也是IX锁,表示我table层级没有锁,我持有的是下一层page的锁。到了page层同理。只有到了row级,发现,如果我们两个需要对同一行进行dml,才会发生争用。

而对于mysql来说,上面的四个层级,意向锁只会在table层发生。database和page是没有的。所以说意向锁是表锁。

有个参数innodb_status_output_locks这个参数打开,你看锁信息会多一点。

还有几张系统表:

sys.innodb_lock_waits

ps.innodb_trx

ps.innodb_locks

ps.innodb_lock_waits

 

show engine innodb status中的heap no表示的是page中的插入顺序。也表示的是具体的记录,也是行锁的表现。每页的heap no都是从2开始的。0和1被系统给了min和max。

 

innodb中的锁管理:

每个页会有个锁的对象

 

 

 

 

也就是说,锁其实是要消耗资源的。

通过位图的方式来管理锁的。一个锁可能是在30字节左右。

标签:IX,lock,innodb,mysql,table,page,row
来源: https://www.cnblogs.com/white-zhan/p/16424306.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有