mysql--表锁
Posted 番茄红了
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql--表锁相关的知识,希望对你有一定的参考价值。
这里写目录标题
特点
偏向myisam存储引擎,开销小,加锁快,无死锁,锁定粒度大,发生锁冲突的概率最高,并发度最低
加读锁
前提描述:
有表1和表2和表3 三个表。给表1加读锁:lock table 表1 read。关掉自动提交(set autocommitt =0)。且有两个链接会话。会话1操作表1,会话2操作表2
操作描述:
1:会话1select本身----可执行
2:会话2select表1—可执行
3:会话1select其他没有锁定的表—不可执行
原因:表1被锁定了,他做不了操作
4:会话2select其他没有锁定的表—可执行
5:会话1执行插入/更新—不可执行
原因:表1执行插入/更新—不可执行
6:会话2执行插入/更新—阻塞等待
原因:表1加了锁,是锁定状态,该状态下其余表无法对其进行非查询的操作。
解决:会话1释放锁,其余表从阻塞状态释放出来,完成未完成的操作
加写锁
前提描述:
有表1和表2和表3 三个表。给表1加读锁:lock table 表1 write。关掉自动提交(set autocommitt =0)。且有两个链接会话。会话1操作表1,会话2操作表2
操作描述:
1:会话1对表1执行查询/更新/插入—可执行
2:会话2对表1执行查询/更新/插入—不可执行,被阻塞
原因
表1是锁定状态,会话2对表1的操作被阻塞了。
锁表前,如果会话2有数据缓存,锁表后,在锁住的表不发生改变前会话2可以读出缓存数据,如果数据发生改变,缓存会失效,操作会被阻塞
解决:会话1释放锁,此时会话2则会得到锁,此时的操作即可成功
汇总
myisam在执行查询语句前,会自动给设计到的所有表加读锁。在执行增删改操作前,会自动给涉及的表加写锁
汇总
myisam在执行查询语句前,会自动给设计到的所有表加读锁。在执行增删改操作前,会自动给涉及的表加写锁
mysql表级锁模式:
表共享读锁(table read lock)
表独占写锁(table write lock)
加读锁,不会阻塞其他进程对统一标的读请求,但会阻塞对同一表的写请求,只有当读锁释放后,才会执行其他进程的写操作
加写锁,会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才能执行其他进行的读写操作
读锁会阻塞写,写锁会阻塞读写
以上是关于mysql--表锁的主要内容,如果未能解决你的问题,请参考以下文章