背景:数据库中的数据的操作:读数据,写数据;所以在这个粒度下就存在两种锁:
(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 锁。