数据库中的锁

1、概述
1.1 为什么要引入锁
多个用户同时对数据库的并发操作时会带来以下数据不一致的问题:
1.1.1 丢失更新
A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统。

1.1.2 脏读
A用户修改了数据,随后B用户又读出该数据,但A用户因为某些原因取消了对数据的修改,数据恢复原值,此时B得到的数据就与数据库内的数据产生了不一致。

1.1.3 不可重复读
A用户读取数据,随后B用户读出该数据并修改,此时A用户再读取数据时发现前后两次的值不一致。

并发控制的主要方法是封锁。锁就是在一段时间内禁止用户做某些操作以避免产生数据不一致。

2、锁的分类
2.1 从数据库系统的角度划分
从数据库系统的角度来看:分为独占锁(即排它锁),共享锁和更新锁
2.1.1 共享 (S)
用于不更改或不更新数据的操作(只读操作),如 SELECT 语句。
2.1.2 更新 (U)
用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。
2.1.3 排它 (X)
用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。

2.2 从程序员的角度划分
从程序员的角度看:分为乐观锁和悲观锁。
2.2.1 悲观锁(Pessimistic Lock)
顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
2.2.2 乐观锁(Optimistic Lock)
顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。
2.2.3 比较
两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。
SQLSERVER 使用锁在多个同时在数据库内执行修改的用户间实现悲观并发控制。

3、锁的粒度
锁粒度是被封锁目标的大小,封锁粒度小,则并发性高,但开销大;封锁粒度大,则并发性低,但开销小。SQL Server支持的锁粒度可以分为为行、页、键、键范围、索引、表或数据库获取锁。
(1)RID:行标识符。用于单独锁定表中的一行。
(2)键:索引中的行锁。用于保护可串行事务中的键范围。
(3)页:8 千字节 (KB) 的数据页或索引页。
(4)表:包括所有数据和索引在内的整个表。

4、锁定时间的长短
锁保持的时间长度为保护所请求级别上的资源所需的时间长度。
用于保护读取操作的共享锁的保持时间取决于事务隔离级别。采用 READ COMMITTED 的默认事务隔离级别时,只在读取页的期间内控制共享锁。在扫描中,直到在扫描内的下一页上获取锁时才释放锁。如果指定 HOLDLOCK 提示或者将事务隔离级别设置为 REPEATABLE READ 或 SERIALIZABLE,则直到事务结束才释放锁。

用于保护更新的排它锁将直到事务结束才释放。如果一个连接试图获取一个锁,而该锁与另一个连接所控制的锁冲突,则试图获取锁的连接将一直阻塞到将冲突锁释放而且连接获取了所请求的锁。

连接的超时间隔已到期。默认情况下没有超时间隔,但是一些应用程序设置超时间隔以防止无限期等待。

5、SQL Server 中锁的自定义
5.1 处理死锁和设置死锁优先级
死锁就是多个用户申请不同封锁,由于申请者均拥有一部分封锁权而又等待其他用户拥有的部分封锁而引起的无休止的等待。

可以使用SET DEADLOCK_PRIORITY控制在发生死锁情况时会话的反应方式。如果两个进程都锁定数据,并且直到其它进程释放自己的锁时,每个进程才能释放自己的锁,即发生死锁情况。

5.2 处理超时和设置锁超时持续时间

@@LOCK_TIMEOUT:返回当前会话的当前锁超时设置,单位为毫秒。
SET LOCK_TIMEOUT:设置允许应用程序设置语句等待阻塞资源的最长时间。当语句等待的时间大于 LOCK_TIMEOUT 设置时,系统将自动取消阻塞的语句,并给应用程序返回”已超过了锁请求超时时段的错误信息。

//下例将锁超时期限设置为 1,800 毫秒。
SET LOCK_TIMEOUT 1800

6、查看锁的信息
(1) 执行 EXEC SP_LOCK 报告有关锁的信息
(2)查询分析器中按Ctrl+2可以看到锁的信息

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值