一、锁机制出现的原因
当数据库面临并发操作时可能会发生数据不一致的情况
1、丢失更新
A、B两人同时更改一条数据,其中一个的修改结果会破坏另一个修改结果。
2、脏读
某条数据A更改后并未提交,B读取到A更改后但未提交的数据,B读取的则为脏数据
3、不可重复读
在同一个事务范围内有两次针对同一数据的查询,由于其它事务的参与,导致两次查询结果不一致
那么添加适当的锁机制,可以有效避免由于并发所导致的数据不一致情况
二、锁机制的种类及应用范围
1、共享锁(s):用于数据库只读操作 例如select语句,同一条记录在同一时刻可以设置多个共享锁
互斥:独占锁。
2、更新锁(u):更新锁是一种中继锁,当事务更改某条数据是,需先获取共享锁,然后试图转换为更新锁,在进一步变成独占锁。
同一资源只允许一个事务获取它的更新锁,可以有效防止多条共享锁试图转换为独占锁而引发的死锁。
3、独占锁/排他锁(x):可以防止并发事务对资源进行访问,资源被独占锁锁定后,任何其他事务无法对本资源进行修改,仅在使用 NOLOCK提示或未提交读隔离级别时才能进行读取操作
互斥:共享锁。
4、意向锁:
粒度:SQLServer可以分为 表、分页、行等级别的数据资源,(表>分页>行)
在某条资源上放置共享锁前,需要对本资源更大粒度范围上(分页或表)设置意向锁,以避免其他事务对本分页放置独占锁
包括 意向共享(IS)、意向独占(IS)、意向独占共享(SIX)、意向更新(IU)、共享意向更新(SIU)、更新意向排他(UIX)
作用:A事务对表内的页或行资源放置共享或排他锁前,在页或行所对应的表上放置意向共享或意向独占锁,B事务试图在该表应用锁前不必检查各个页或行锁,只需要检查表上的意向锁,可以有效提高效率