简单演示 Oracle 数据库并发导致段级锁(表级锁)

摘要:
本文的内容是软件环境的简单演示。Oracle数据库并发会导致段级锁(表级锁)。本文简单地演示了并发导致的行级锁。并发是指两个或多个用户修改同一数据。软件环境Windows2003ServerOracle11gRelease1简要说明了Oracle数据库并发会导致段级锁(表级锁)。首先,打开echo会话1:SQL˃selectdistinctsidfromv$mystat;SID---------124SQL˃按范围创建桌面分区;已创建表。通过查看V$LOCK视图,可以发现数据库只在表t和p1分区上设置TM共享锁,而不是在p2分区上设置。TM锁是段级锁。它允许相同级别或更低级别的锁,但拒绝更高级别的锁。DDL操作显然更高。Oracle将锁的影响降至最低。

本文内容

  • 软件环境
  • 简单演示 Oracle 数据库并发导致段级锁(表级锁)

本文简单演示并发导致的行级锁。并发是两个以上的用户对同样的数据进行修改(包括插入、删除和修改)。锁的产生是因为并发。没有并发,就没有锁。并发的产生是因为系统需要,系统需要是因为用户需要。

软件环境


  • Windows 2003 Server
  • Oracle 11g Release 1 (11.1)

简单演示 Oracle 数据库并发导致段级锁(表级锁)


首先,打开一个回话 session 1:

SQL> select distinct sid from v$mystat;
 
       SID
----------
       124
 
SQL> create table t(x int) partition by range(x)(partition p1 values less than(10),partition p2 values less than(maxvalue));
 
表已创建。
 
SQL> insert into t values(1);
 
已创建 1 行。
 
SQL> select * from t partition(p1);
 
         X
----------
         1
 
SQL> select sid,type,id1,id2,lmode,request,block
  2  from v$lock where sid=124;
 
       SID TYPE         ID1        ID2      LMODE    REQUEST      BLOCK
---------- ----- ---------- ---------- ---------- ---------- ----------
       124 AE            99          0          4          0          0
       124 TM        128807          0          3          0          0
       124 TM        128808          0          3          0          0
       124 TX        589847      46045          6          0          0
 
SQL> select object_name, subobject_name
  2    from dba_objects
  3   where object_id in (128807, 128808);
 
OBJECT_NAME     SUBOBJECT_NAME
--------------- ---------------
T
T               P1
 
SQL>
  • 创建分区表 t,包含两个分区,p1和p2。
  • 向表插入一条记录,该记录落在分区 p1,p2 分区没有。
  • 通过查看 V$LOCK 视图发现,数据库只在表 t 和 p1 分区上设置了 TM 共享锁,但是 p2 上没有。
  • 当锁的类型为 TM 时,字段 ID1 表示加锁的对象 ID。通过查看 DBA_OBJECTS 视图可以获得对象名称,128807 和  128808 分别对应 t 表和 t 表的 p1 分区。

再打开一个回话 session 2:

此时,如果我们对 t 表、t 表的 p1 分区和 t 表的 p2 分区做 DDL 操作,会发生什么:

SQL> select distinct sid from v$mystat;
 
       SID
----------
       140
 
SQL> truncate table t;
truncate table t
               *
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效
 
 
SQL> alter table t truncate partition p1;
alter table t truncate partition p1
            *
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效
 
 
SQL> alter table t truncate partition p2;
 
表被截断。
 
SQL>
  • 只有 p2 分区没加段级锁,所以 p2 上可以进行 DDL 操作。
  • TM 锁是一个段级锁,它允许同级别或更低级别的锁,但是拒绝高级别的锁,DDL 操作显然高。Oracle 尽可能地减少锁的影响范围。
SQL> insert into t values(11);
 
已创建 1 行。
 
SQL> select * from t partition(p2);
 
         X
----------
        11
 
SQL> select sid,type,id1,id2,lmode,request,block
  2  from v$lock where sid in (124,140)
  3  order by sid,type;
 
       SID TY        ID1        ID2      LMODE    REQUEST      BLOCK
---------- -- ---------- ---------- ---------- ---------- ----------
       124 AE         99          0          4          0          0
       124 TM     128808          0          3          0          0
       124 TM     128807          0          3          0          0
       124 TX     327711      45817          6          0          0
       140 AE         99          0          4          0          0
       140 TM     128807          0          3          0          0
       140 TM     128809          0          3          0          0
       140 TX     196611      45960          6          0          0
 
已选择8行。
 
SQL> select object_name, subobject_name
  2    from dba_objects
  3   where object_id in (128807, 128808, 128809);
 
OBJECT_NAME     SUBOBJECT_NAME
--------------- ---------------
T
T               P1
T               P2
 
SQL>
  • 当向 p2 分区插入一条数据时,p2 分区也加上了一个共享锁,即ID1=128809。
  • TM 锁是表级共享锁,表通常看作一个段,当某个表有几个段时,每个段都会分别加上锁。

简单演示 Oracle 数据库并发导致段级锁(表级锁)第1张

简单演示 Oracle 数据库并发导致段级锁(表级锁)第2张

免责声明:文章转载自《简单演示 Oracle 数据库并发导致段级锁(表级锁)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android 移动缩放的ImageViewLess(初步了解) flex(弹性盒,伸缩盒) 像素 视口(viewport) 手机像素 完美视口下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Oracle DBCA工具检测不到ASM磁盘组

本例环境: 操作系统OEL 6.5 数据库版本:11.2.0.4 问题:DBCA建库的时候,检测不到ASM磁盘组   因素一:可能是在授权的时候执行了 chown –R 775 /u01/app等修改权限。 分析:数据库无法连接ASM,这应该是权限问题,grid的$ORACLE_BASE是/u01/app/grid,oracle的$ORACLE_BASE是...

MSSQLSERVER数据库 递归查询例子

SqlServer2005版本的Sql如下:比如一个表,有id和pId字段,id是主键,pid表示它的上级节点,表结构和数据:CREATE TABLE [aaa]( [id] [int] NULL, [pid] [int] NULL, [name] [nchar](10))GOINSERT INTO aaa VALUES(1,0,'a')INSERT IN...

mysql常用的信息查询函数

mysql常用信息函数 select version(); --当前数据库服务器版本信息 select database(); --当前使用的数据库 select current_user() 或 select user();...

使用TRY CATCH进行SQL Server异常处理

TRY...CATCH是Sql Server 2005/2008令人印象深刻的新特性.提高了开发人员异常处理能力.没有理由不尝试一下Try.. Catch功能.    *      TRY 块 - 包含可能产生异常的代码或脚本    *      CATCH 块 - 如果TRY块出现异常,代码处理流将被路由到CATCH块.在这里你可以处理异常,记录日志等....

db2性能优化

性能优化概述 DB2 的性能优化可以从三个方面分析:内存,CPU 和 I/O 。DB2 性能优化是一件较为复杂的综合性的工作 , 需要对问题的根源作全方位的探索和思考。同时也需要较深厚的数据库管理经验与优化知识。这对于初学者来说可能有些勉为其难。但是在很多情况下,随着 DB2 数据库中的数据量的不断增长或者用户数的激增,数据库系统的性能会显著下降,而此时快...

ORACLE 数据、表误删恢复(转)

今天主要以oracle数据库为例,介绍关于表中数据删除的解决办法。(不考虑全库备份和利用归档日志)删除表中数据有三种方法:·delete(删除一条记录)·drop或truncate删除表格中数据 1.delete误删除的解决方法原理: 利用oracle提供的闪回方法,如果在删除数据后还没做大量的操作(只要保证被删除数据的块没被覆写),就可以利用闪回方式直接...