文章目录
- 行级锁
- 1. 用两个连接connection登陆mysql
- 2. 测试无索引情况
- 1)机器1开启事务,执行更新北京仓数据sql,不提交事务
- 2)机器2开启事务,先查询北京仓
- 3)机器2开始更新上海仓数据
- 4)机器1事务回滚
- 5) 提交
- 表级锁
- 1. 建立索引
- 2. 测试
- 1)机器1更新北京仓数据
- 2)机器2更新上海仓数据
- 3) 两个都commit
- 索引失效,行级锁变表级锁
- 1)机器1更新北京仓sql,但是sql中索引隐式变化导致索引失效
- 2)机器2更新上海仓
- 3)机器1 rollback
- 4)机器2 commit
- 总结
行级锁
1. 用两个连接connection登陆mysql
目前数据库里该表有两条数据
2. 测试无索引情况
机器1对1001进行更新操作。
1)机器1开启事务,执行更新北京仓数据sql,不提交事务
2)机器2开启事务,先查询北京仓
依然是5000,机器1的事务未提交
3)机器2开始更新上海仓数据
卡住了,迟迟无法运行,说明此时mysql是表级锁,将整张表都锁住了,导致无法对另一条数据进行更新操作。
4)机器1事务回滚
此时机器2的更新操作成功,并且显示阻塞了21秒
5) 提交
上海仓count确实减1,为4999
表级锁
1. 建立索引
2. 测试
1)机器1更新北京仓数据
2)机器2更新上海仓数据
不同于之前情况,这次是一次成功。说明表没有被锁,目前为行级锁
3) 两个都commit
数据库显示正常。
索引失效,行级锁变表级锁
1)机器1更新北京仓sql,但是sql中索引隐式变化导致索引失效
2)机器2更新上海仓
被阻塞,此时又变成了表级锁。
3)机器1 rollback
机器1 事务rollback后,机器2更新成功
4)机器2 commit
数据库显示正常
若对索引失效不了解,可参考mysql的索引失效情况汇总
总结
若mysql未命中索引或索引失效时,表级锁变行级锁。