#Isolation&lock(锁)
更新锁(Update locks)
更新锁定是共享锁定和排他锁定的混合。共享锁是在DML执行之前进行更改之前使用的。其他事务可以读取锁定的数据,但不能修改它。一旦修改开始,它就成为一个排他锁,其他事务直到事务结束后才能读取和更新锁定的数据。因此,更新锁可以避免造成死锁。同一时间只有一个更新锁可以锁定数据,类似于排他锁。但不同之处在于,更新锁只能锁定自身,而不能修改底层数据。在修改数据之前,可以将它转换为排他锁,这可以通过提示UPDLOCK更新锁来实现。
共享锁(Shared locks)
共享锁在数据读取悲观(慢节奏)模块下并行持有。共享锁操作的同时保持其他事务可访问,但不修改锁定的数据。除非事务是通过提示符(READCOMMITTED, READCOMMITTEDLOCK)或隔离级别等于或大于可重复读(Repeatable READ)完成的,否则锁定的数据将在共享锁READ完成后被释放。在一般情况下,您不会看到共享锁,因为SELECT在系统运行期间释放了锁。dm_tran_locks命令选择。这就是为什么需要额外的提示来查看锁的类型。
排他锁(eXclusive locks)
排他锁定用于修改数据并防止其他事务被修改的事务中。您只能通过NOLOCK的提示读取锁定的数据或未确认的隔离级别数据。SQL Server在修改数据时使用独占锁定。锁定其他事务的请求将被拒绝,直到事务关闭。一个资源只能有一个排他锁。当一个事务持有资源上的排他锁时,其他事务无法读取该资源。因此,这个锁限制了并发行数。
意图锁定(Intent locks)
有意锁定意味着当一个事务通知另一个事务时,它有锁定数据的“意图”,所以它就像名称一样。它确保事务获得要修改的正确数据,防止其他事务获得更高级别的锁。这意味着您打算在获得锁或表上的行之前锁定一个Page。这可以防止其他事务在表上放置排他锁并试图解锁行或页。包含锁定被放置在页和表上,以防止其他事务锁定数据。
锁兼容性矩阵 (Lock Compatibility Matrix)
通过锁兼容性矩阵,可以将同样好的资源锁与其他锁模块进行比较。
图片摘自墨大adb课件
IS和IX
- 「意向共享锁(IS)」:事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。
- 「意向排他锁(IX)」:事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。
如果一个事务请求的锁模式与当前的锁兼容,InnoDB就将请求的锁授予该事务;反之,如果两者不兼容,该事务就要等待锁释放。
如果博主的这篇文章对您有帮助,点赞支持一下呀。
如果觉得文章写的可以,转载请带上我哦!
康康的笔记
图片从各个网站转载,如有侵权请联系删除!