独占锁、共享锁、更新锁,乐观锁、悲观锁
(1)从数据库系统的角度来看,锁分为以下三种类型:
- 独占锁(Exclusive Lock)
- 共享锁(Shared Lock)
- 更新锁(Update Lock)
(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:
共享锁
- LOCK TABLE 表 IN SHARE MODE ;
排他锁:
- LOCK TABLE 表 IN EXCLUSIVE MODE ;
加锁后其它人不可操作,直到加锁用户解锁,用commit或rollback解锁
行排他锁不阻止其他Session申请表共享锁和其他行的排他锁,但阻止申请表排他锁和锁定行的任何锁。
表排他锁阻止其他Session的申请的所有锁。
表共享锁不阻止其他Session申请行排他锁和表共享锁,但阻止申请表排他锁。
一道相关的试题:
- User SCOTT executes the following command on the EMP table but has not issued COMMIT,ROLLBACK, or any data definition language (DDL)ommand:
- SQL> SELECT job FROM emp WHERE job='CLERK' FOR UPDATE OF empno;
- SCOTT has opened another session to work with the database. Which three operations would wait when issued in SCOTT's second session?(Choose three.)
- A. LOCK TABLE emp IN SHARE MODE;(阻止申请行的共享锁)
- B. LOCK TABLE emp IN EXCLUSIVE MODE;(阻止申请表的排他锁)
- C. DELETE FROM emp WHERE job='MANAGER';
- D. INSERT INTO emp(empno,ename) VALUES(1289,'Dick');
- E. SELECT job FROM emp WHERE job='CLERK' FOR UPDATE OF empno;(阻止申请行的排他锁)
上题答案给的是A、B、E
参考链接:
http://www.cnblogs.com/adforce/archive/2011/04/20/2021929.html
http://blog.csdn.net/tuber727/article/details/12782247