mysql 一个更新两个锁_mysql优化二之锁机制

mysql优化二之锁机制

mysql提供了锁机制和MVCC机制来保证并发操作的安全性,这里主要讨论锁机制,

MVCC见下篇文章

mysql的锁按照锁粒度可分为行锁与表锁,按照操作类型划分可读锁和写锁

InnoDB存储引擎支持表锁和行锁,默认锁为行锁,MyIsam只支持表锁

锁粒度越高则并发性越好

表锁

一、操作语法

1、 show open tables;查看数据库中哪些表加了锁

d06f64ea506dd918e03a89845e3a37bc.png

in-use为0则表示未加锁

2、 lock table (table_name) read(write)

530704e403875568a2929a66f22e0da3.png

f65cf7e5d8cb77b561d3126f30d7549f.png

3、 unlock tables;解锁

二、示例

1、 读锁

开了两个mysql客户端,左边客户端中给mytest数据库中的test1表加了读锁

左客户端执行读操作,右客户端执行读操作,可以看到两者都可以执行

8a7833f9b59da055f1260b1fb0958f9d.png

对于同一数据库中的其他表操作,左客户端拒绝执行,右客户端可以执行

fe61691a18acaa7e7f06a14b32d42102.png

对于被锁住的表执行写操作

a2f44b404b7f7a711eb8455262a6d706.png

左客户端拒绝执行

64b67a1257a2ae7bca957c154d6caf63.png

右客户端阻塞住

此时我们解锁

001048622bae050a0342dd08afe569e7.png

可以看到右客户端立即被释放并正确执行操作

2、 写锁

给左客户端test1表加上写锁

左客户端读/写正常,右客户端读/写均被阻塞

7fc0019094d2f2c0786d0f2c198b60ee.png

左客户端读/写该数据库中的其他表拒绝执行,右客户端可以正常执行

279fe1cc449e99d5e6e480a5cf3fe120.png

行锁

因为mysql默认的存储引擎是InnoDB,而InnoDB默认为行锁,我们要测试行锁首先需要把mysql的自动提交关闭

93e0b0aa64fc4e5736038b61f654cea1.png

行级锁读操作两个客户端互不影响

写操作如果操作的不是同一行,也不影响,若操作的是同一行则后一个客户端的请求被阻塞,直到前一个客户端的请求提交

f02dcb236d489c86f7a863fffdcef87c.png

注意点

1、 间隙锁

65003c661ed48fd15dc575481337865a.png

我们在左边客户端对id在(0,5]范围内的数据做写操作,但是由于数据表中没有id为4的数据行,按理说右边数据库插入一个id为4的数据行不会被锁住,但是事实表明它被锁住了。这既是mysql的间隙锁机制。因此我们在数据库操作时其实应该避免这种间隙的产生,我们可以在表里设置一个状态位,当要删除某一数据行时,可以选择将该状态位设置为无效而不是真正的删除。

2、 索引失效

当where查询条件没有索引时,行锁变表锁

55dcf4774ae39c1fa4d4d035ded5b3c6.png

4214b70ad602b7536cab3394488c3771.png

当where查询条件有索引但是索引失效时,行锁仍然变表锁

d5a650a320d932eeff40ff6bd076f579.png

b92d20458702b974cb834751ccdf6ee6.png

当左客户端在已经减了索引的loc列用int型来查找时,索引失效就会导致整张表被锁住

行锁变表锁的原因:mysql的行锁是用索引实现的

3、 如何锁住一行

257347e203d4ab048769c8206a78c892.png

在select语句找出某一行之后加一个for update

fbd514ded75ac6a879cd2ad975eff305.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值