(sql补充)关于锁

举个例子吧 当你要进一个房间的时候,你想推门,这个时候刚好有个人想出来,他也想推门出去,于是,两个人就卡在那了,结果,后面排队的人也都动弹不了了,假如这个房间是个数据库,那么,数据库这个时候就卡壳了。
锁正是为避免这种情况出现的
悲观锁就是 一个一个来,当有人想进这个房间的时候,其他人都别动
但假如这个房间有很多门,这些门通往不同的地方,比如,有可以直接进洗手间的,有可以进厨房的,结果,你一个人想去卧室,却禁止其他人进洗手间,这样对效率就会产生影响。于是,乐观所就是,当你想进的时候,等到你来到门的门口,才把当前这个门锁住。之所以叫乐观,也就是说,乐观地假定你的行为不会影响到其他人,等到影响到的时候再加锁。而悲观的意思,就是一开始就假定你会影响到其他人了,所以全部锁了干净。
------------------------------来自百度知道比较通俗的解释

 为什么要引入锁 




多个用户同时对数据库的并发操作时会带来以下数据不一致的问题:


丢失更新

a,b两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统


脏读

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


不可重复读

a用户读取数据,随后b用户读出该数据并修改,此时a用户再读取数据时发现前后两次的值不一致


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


锁的分类



锁的类别有两种分法:

1. 从数据库系统的角度来看:分为独占锁(即排它锁),共享锁和更新锁

共享锁
共享 (s) 锁允许并发事务读取 (select) 一个资源。资源上存在共享 (s) 锁时,任何其它事务都不能修改数据。一旦已经读取数据,便立即释放资源上的共享 (s) 锁,除非将事务隔离级别设置为可重复读或更高级别,或者在事务生存周期内用锁定提示保留共享 (s) 锁。
更新锁
更新 (u) 锁可以防止通常形式的死锁。一般更新模式由一个事务组成,此事务读取记录,获取资源(页或行)的共享 (s) 锁,然后修改行,此操作要求锁转换为排它 (x) 锁。如果两个事务获得了资源上的共享模式锁,然后试图同时更新数据,则一个事务尝试将锁转换为排它 (x) 锁。共享模式到排它锁的转换必须等待一段时间,因为一个事务的排它锁与其它事务的共享模式锁不兼容;发生锁等待。第二个事务试图获取排它 (x) 锁以进行更新。由于两个事务都要转换为排它 (x) 锁,并且每个事务都等待另一个事务释放共享模式锁,因此发生死锁。
若要避免这种潜在的死锁问题,请使用更新 (u) 锁。一次只有一个事务可以获得资源的更新 (u) 锁。如果事务修改资源,则更新 (u) 锁转换为排它 (x) 锁。否则,锁转换为共享锁。
独占锁:只允许进行锁定操作的程序使用,其他任何对他的操作均不会被接受。执行数据更新命令时,sql server会自动使用独占锁。当对象上有其他锁存在时,无法对其加独占锁。
共享锁:共享锁锁定的资源可以被其他用户读取,但其他用户无法修改它,在执行select时,sql server会对对象加共享锁。

2. 从程序员的角度看:分为乐观锁和悲观锁。

乐观锁:完全依靠数据库来管理锁的工作。
悲观锁:程序员自己管理数据或对象上的锁处理。
原文地址:https://www.cnblogs.com/zhujianxipan/p/3146915.html