数据库碎片学习:独占锁、共享锁、更新锁,乐观锁、悲观锁


独占锁、共享锁、更新锁,乐观锁、悲观锁
(1)从数据库系统的角度来看,锁分为以下三种类型:

  • 独占锁(Exclusive Lock)
独占锁锁定的资源只允许进行锁定操作的程序使用,其它任何对它的操作均不会被接受。执行数据更新命令,即INSERT、 UPDATE 或DELETE 命令时,SQL Server 会自动使用独占锁。但当对象上有其它锁存在时,无法对其加独占锁。独占锁一直到事务结束才能被释放。
  • 共享锁(Shared Lock)
共享锁锁定的资源可以被其它用户读取,但其它用户不能修改它。在SELECT 命令执行时,SQL Server 通常会对对象进行共享锁锁定。通常加共享锁的数据页被读取完毕后,共享锁就会立即被释放。
  • 更新锁(Update Lock)
更新锁是为了防止死锁而设立的。当SQL Server 准备更新数据时,它首先对数据对象作更新锁锁定,这样数据将不能被修改,但可以读取。等到SQL Server 确定要进行更新数据操作时,它会自动将更新锁换为独占锁。但当对象上有其它锁存在时,无法对其作更新锁锁定。


(2)从程序员的角度看,锁分为以下两种类型:

  • 悲观锁(Pessimistic Lock)
悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。
  • 乐观锁(Optimistic Lock)
相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。
而乐观锁机制在一定程度上解决了这个问题。乐观锁,大多是基于数据版本( Version )记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。


简要说明为什么会发生死锁?解决死锁的主要方法是什么?
若干事务相互等待释放封锁,就陷入无限期等待状态,系统就进入死锁

(1). 测试用的基础数据:
 
 CREATE  TABLE  Lock1(C1  int  default ( 0 ));
 CREATE  TABLE  Lock2(C1  int  default ( 0 ));
 INSERT  INTO  Lock1  VALUES( 1 );
 INSERT  INTO  Lock2  VALUES( 1 );
 
(2). 开两个查询窗口,分别执行下面两段 sql
 -- Query 1 
 Begin  Tran 
   Update Lock1  Set C1 = C1 + 1 ;
   WaitFor  Delay  ' 00:01:00 ' ;
   SELECT  *   FROM Lock2
 Rollback  Tran ;
 
 -- Query 2 
 Begin  Tran 
   Update Lock2  Set C1 = C1 + 1 ;
   WaitFor  Delay  ' 00:01:00 ' ;
   SELECT  *   FROM Lock1
 Rollback  Tran ;
 
3)、测试完后删除这两张表。
droptable Lock1;
droptable Lock2;



解决死锁的方法应从预防和解除的两个方面着手:
(1)死锁的预防方法:
a、要求每一个事务必须一次封锁所要使用的全部数据(要么全成功,要么全不成功)
b、规定封锁数据的顺序,所有事务必须按这个顺序实行封锁。
(2)允许死锁发生,然后解除它,如果发现死锁,则将其中一个代价较小的事物撤消,回滚这个事务,并释放此事务持有的封锁,使其他事务继续运行。

oracle:

共享锁

[sql]  view plain copy
  1. LOCK TABLE 表 IN SHARE MODE ;  


排他锁:

[sql]  view plain copy
  1. LOCK TABLE 表 IN EXCLUSIVE MODE ;  


加锁后其它人不可操作,直到加锁用户解锁,用commit或rollback解锁



行排他锁不阻止其他Session申请表共享锁和其他行的排他锁,但阻止申请表排他锁和锁定行的任何锁。
表排他锁阻止其他Session的申请的所有锁。
表共享锁不阻止其他Session申请行排他锁和表共享锁,但阻止申请表排他锁。


一道相关的试题:
[sql]  view plain copy
  1. User SCOTT executes the following command on the EMP table but has not issued COMMIT,ROLLBACKor any data definition language (DDL)ommand:  
  2. SQL> SELECT job FROM emp WHERE job='CLERK' FOR UPDATE OF empno;  
  3. SCOTT has opened another session to work with the database. Which three operations would wait when issued in SCOTT's second session?(Choose three.)  
  4. A. LOCK TABLE emp IN SHARE MODE;(阻止申请行的共享锁)  
  5. B. LOCK TABLE emp IN EXCLUSIVE MODE;(阻止申请表的排他锁)  
  6. C. DELETE FROM emp WHERE job='MANAGER';  
  7. D. INSERT INTO emp(empno,ename) VALUES(1289,'Dick');  
  8. E. SELECT job FROM emp WHERE job='CLERK' FOR UPDATE OF empno;(阻止申请行的排他锁)  
SELECT …… FROM …… FOR UPDATE 语句申请的是相应行的排他锁以及行所在表的共享锁。

上题答案给的是A、B、E


参考链接:

http://www.cnblogs.com/adforce/archive/2011/04/20/2021929.html

http://blog.csdn.net/tuber727/article/details/12782247


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值