意向锁(Intention Lock)

背景:数据库中的数据的操作:读数据,写数据;所以在这个粒度下就存在两种锁:

             (1)读锁      (s锁)    共享锁,事务A在读数据的同时,事务B也可以读,

             (2)写锁      (X锁)   排他锁 ,事务A在写数据的时候,其他的事务必须等待A事务,完成任务以后,释放了该锁

一般的锁,在不同粒度上又划分为

              (1) 表级锁

              (2)行级锁

  问题导入:为什么会用到意向锁?

                    当我们向一张表加入表级锁的时候,这时候我们必须去表中每一行去遍历,看看对应的行是否已经用到对应的锁,这时候如果数据库中的数据海量的话,想要完成这个认为的难度就非常的大,难道没有一个好的方法?

               意向锁在原有的锁(X锁和S锁)引入了新的锁(IX和IS)锁 

               意向锁是个表级锁

              获得锁:(获得对象锁)

                         IX  --表示 如果有事务想获得数据对象X锁之前,先获得表IX锁

                         IS -- 表示如果事务想要获得数据对象S锁之前,先获得表IS锁

              加锁:(加入表级锁)

                           如果事务对表加X锁,看看有没有其他的事务对表加锁(S/X/IS/IX)如果有的话,加索失败

 细节:

        

  • 任意 IS/IX 锁之间都是兼容的,因为它们只是表示想要对表加锁,而不是真正加锁;
  • S 锁只与 S 锁和 IS 锁兼容,也就是说事务 T 想要对数据行加 S 锁,其它事务可以已经获得对表或者表中的行的 S 锁。

你可能感兴趣的:(意向锁(Intention Lock))