为什么要加锁
- 为了保证多用户下的数据库的完整性和一致性
MYSQL有那些锁呢
按照操作分类
- 读锁
- 写锁
按照粒度分类
- 页锁
- 表锁
- 行锁
悲观锁和乐观锁使用方式
- 悲观锁
- 每次查询数据都会认为别人会修改,很悲观,所以需要加锁
- 行锁、表锁、读锁、写锁均是悲观锁
- 并发度低
- 乐观锁
- 每次查询都认为别人不会修改,很乐观,更新的时候会判断一下别人有没有更新数据。
- 主要是版本号机制或者CAS算法来实现
- 并发度高
什么是死锁,如何解决死锁
两个或者多个事务在同一资源上互相占用,并请求对方的资源,造成死锁。
- 尽量的一次性锁住自己所需要的资源
- 一些业务,如果行锁容易死锁,那么就提高锁的颗粒度,采用表锁
- 如果不同程序访问多个表,尽量的约定好访问的顺序。
行锁是怎么实现的
-
记录锁:直接把一条记录锁定
-
间隙锁:两个记录中逻辑上还没有填入数据的部分,把间隙区间锁定。()开区间。然后如果采用等值查询或者范围查询,那么就会进行锁定
-
临建锁(Next-key lock):记录锁和间隙锁的组合,除了锁住记录本身,还要锁住所在的间隙。(]
-
Mysql默认为临建锁,如果只有一个记录,会退化成记录锁,如果没有任何记录,那就变成间隙锁