易截截图软件、单文件、免安装、纯绿色、仅160KB

Oracle 行级锁的开销

首先来复习一下行级锁的机制。当一个事务开始时必选先申请一个TX锁(保护回滚段、回滚数据块),只有先申请到回滚段资源后才能开始一个事务,才能进行DML操作。这个动作完成后,事务就可以开始修改数据了。当修改数据表的记录时,遵循以下的操作顺序。
1.获得表的TM锁(保护事务执行过程中其它用户不能修改表结构)
2.在要修改的数据块头部的ITL表中申请一个空闲表项,记录事务号,实际记录的是这个事务要使用的回滚段地址。
3.修改数据块的某条记录时,设置该记录头部的ITL索引指向第2步申请的表项,然后再修改记录内容。修改前需要在回滚段对记录修改前的记录状态做一个copy。
4.当其它用户想并发修改这条记录时,会根据记录头的ITL索引读取数据块头部ITL表项的内容,查看这个事务是否已经提交。
5.如果没有提交,这个用户会等待前一个用户的TX锁的释放。
从上面的工作机制可以看出,无论一个事务修改多少个表的多少记录,该事务真正需要的只是一个TX锁和每个表的TM锁,内存开销非常小。所谓的行级锁只是数据块头、数据记录头的一些字段。所以ORACLE的行级锁虽然有锁的功能,但是没有锁的开销。
举例证明一下:
会话1:
SQL> select * from test;
        ID
----------
        12
        16
        18
SQL> savepoint s;
保存点已创建。
SQL> update test set id=19 where id=18;
已更新 1 行。
会话2:
SQL> conn sjh/sjh
已连接。
SQL> update test set id=190 where id=18;
--在等待...
会话1:
SQL> rollback to s;
回退已完成。
--会话2继续等待...
会话3:
SQL> select username,event,sid,blocking_session from v$session where username='S
JH';
USERNAME
------------------------------
EVENT                                                                   SID


相关文档:

ORACLE中的触发器和游标是在内存中吗?

作者: 三十而立时间:2009年11月08日 12:15:21请尊重原创作品。转载请保持文章完整性,并以超链接形式注明原始作者“inthirties(三十而立)”和出处”http://blog.csdn.net/inthirties/archive/2009/11/08/4786769.aspx”,深入讨论可以联系inthirties@gmail.com。在csdn上看到一个网友问的一个问题 http://topic.csdn.net ......

Myeclipse中连接Oracle的经典代码

 package cn.edu.bit.test;
import java.sql.*;
public class Jdbc {
 public static void main(String[] args)
 {
     try{ 
      Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
     System.out.p ......

在PB中利用ORACLE的替换函数REPLACE

      PB自带的REPLACE语句用着总有些不习惯。今天同事在做数据迁移中,用到替换功能,根据不同的登录用户,选择该用户下的表。所以,我就用ORACLE的函数来实现它。其实挺简单的,就是一个PB动态SQL语句的例子而已。下面是个例子,SQL语句自已拼装好。注意拼装的SQL语句末尾不要习惯的加“; ......

oracle通过数据字典查询看执行计划

SELECT a.ADDRESS,
       sql_text,
       executions,
       rows_processed,
       cpu_time,
       a.DISK_READS,
      ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号