解析Oracle多粒度锁的验证步骤

文章作者 100test 发表时间 2008:03:31 12:38:53
来源 100Test.Com百考试题网


创建测试表

  [email protected]>create table test (a number,b number);

  表已创建。

  1 对于未提交的insert操作

  [email protected]>insert into test values(10,20);

  已创建 1 行。

SQL> 0select * from v$lock. 
  ADDR KADDR SID TYPE ID1 D2 LMODE REQUEST CTIME BLOCK
  12AB9394 12AB93A8 17 TM 29512 0 3 0 84 0
  12AF9218 12AF9324 17 TX 589841 5506 6 0 84 0

  可见,对于未提交的insert操作,会产生两个锁,其类型(TYPE)分别为TM和TX,也就是表级意向锁和事务锁。

  表级意向锁的模式(LMODE)为:3,表示是row exclusive,即表示此表中的某行获得了行排他锁。

  事务锁的模式(LMODE)为:6, 表示是exclusive,即排他锁,表示此事务获得了排他锁。

  BLOCK表示此锁是否阻塞了其它的锁,即发生死锁;此处没有。

  2 对于提交的insert操作

  [email protected]>commit;

  提交完成。

SQL> 0select * from v$lock.

  ADDR KADDR SID TYPE ID1 D2 LMODE REQUEST CTIME BLOCK

  此处已没有记录,说明在提交后,即完成了锁的释放。

  3 对于未提交的0update操作

  [email protected]>0update test set a=11 where a=10;

  已更新 1 行。

SQL> 0select * from v$lock. 
  ADDR KADDR SID TYPE ID1 D2 LMODE REQUEST CTIME BLOCK
  12AB9394 12AB93A8 17 TM 29512 0 3 0 3 0
  12AF9218 12AF9324 17 TX 262153 5590 6 0 3 0

  可见0update操作所引起的锁的信息完全等同于insert操作……

  4 对于提交的0update操作

  [email protected]>commit;

  提交完成。

SQL> 0select * from v$lock. 
  ADDR KADDR SID TYPE ID1 D2 LMODE REQUEST CTIME BLOCK

  此处已没有记录,说明在提交后,即完成了锁的释放。

  5 对于0select操作

[email protected]>0select * from test where a=11. 
  A B
  ---------- ----------
  11 20
  SQL> 0select * from v$lock.
  ADDR KADDR SID TYPE ID1 D2 LMODE REQUEST CTIME BLOCK

  此处已没有记录,说明0select操作不会引起任何锁。

  这是与sql server等数据库不同的,这些数据库0select操作也会引起锁,以取得一致读;

  而oracle是通过回滚机制实现一致读的,所以不需要引入锁机制,这极大增强了oracle的并发度。



相关文章


微软预先展示Server2008五大版本
Java中消除实现继承和面向接口的编程
美国高级工程师谈Struts2走向
Linux操作系统的基本用户环境
解析Oracle多粒度锁的验证步骤
一个月通过二级VFP考试心得
在Linux中对Bash变量内容修改的方法
思科考试辅导以太网数据包、IP包、TCP_UDP包结构
网页木马深度剖析以及手工清除8
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛