聊聊mysql中的锁

                           今天我们聊聊mysql中innodb存储引擎中支持的锁以及锁算法

   先看下innodb对事物的隔离级别支持的程度:

                     

   应对这些隔离级别innodb又是怎么实现的呢?我们一起来看下,innodb支持的锁类型有

                             共享锁(行锁):Shared Locks
                             排它锁(行锁):Exclusive Locksl
                             意向锁共享锁(表锁):Intention Shared Locks
                             意向锁排它锁(表锁):Intention Exclusive Locks
                             自增锁:AUTO-INC Locks

共享锁:               又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改;   加锁释锁方式:
                                                  select * from users WHERE id=1 LOCK IN SHARE MODE;
                                                  commit/rollback

排他锁:               又称为写锁,简称X锁,排他锁不能与其他锁并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的锁(共享锁、排他锁),只有该获取了排他锁的事务是可以对数据行进行读取和修改,(其他事务要读取数据可来自于快照)加锁释锁方式:
                                                   delete / update / insert 默认加上X锁
                                                   SELECT * FROM table_name WHERE ... FOR UPDATE
                                                   commit/rollback

innodb行锁其实是通过对索引枷锁来实现的只有通过索引条件进行数据检索,InnoDB才使用行级锁,否则,InnoDB将使用表锁(锁住索引的所有记录) 表锁:lock tables xx read/write;

意向共享锁(IS) :       表示事务准备给数据行加入共享锁,即一个数据行加共享锁前必须先取得该表的IS锁,意向共享锁之间是可以相互兼容的


意向排它锁(IX):       表示事务准备给数据行加入排他锁,即一个数据行加排他锁前必须先取得该表的IX锁,意向排它锁之间是可以相互兼容的

意向锁(IS 、IX) 是InnoDB 数据操作之前 自动加的,不需要用户干预  意义在于当事务想去进行锁表时,可以先判断意向锁是否存在,存在时则可快速返回该表不能启用表锁

行锁常见的算法: 记录锁 Record Locks    间隙锁 Gap Locks   临键锁 Next-key Locks

Next-key locks: 锁住记录+ 区间(左开右闭)当sql执行按照索引进行数据的检索时,查询条件为范围查找(between and、<、>等)并有数据命中则此时SQL语句加上的锁为Next-key locks, 锁住索引的记录+ 区间(左开右闭)

                       
Gap locks:  锁住数据不存在的区间(左开右开)当sql执行按照索引进行数据的检索时,查询条件的数据不存在,这时SQL语句加上的锁即为Gap locks, 锁住索引不存在的区间(左开右开)

                      
Record locks: 锁住具体的索引项当sql执行按照唯一性(Primary key、Unique key)索引进行数据的检索时,查询条件等值匹
配且查询的数据是存在,这时SQL语句加上的锁即为记录锁Record locks,

                     

幻想读的重点在于新增,事物前后发现读出的记录数不一致,而Next-key左开右闭并且锁住区间,所以可以解决幻想读如图所示:

                     

不可重复读的重点在于修改,同样的条件发现前后读出的值不一样了,我们可以通过共享锁(S)来解决如图:

                     

而脏读我们可以通过加排它锁(或者叫悲观锁)来解决如图所示:

                     

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值