简单演示 Oracle 数据库并发导致行级锁
2013-03-12 20:11
295 查看
本文内容
软件环境简单演示 Oracle 数据库并发导致行级锁
本文简单演示并发导致的行级锁。并发是两个以上的用户对同样的数据进行修改(包括插入、删除和修改)。锁的产生是因为并发。没有并发,就没有锁。并发的产生是因为系统需要,系统需要是因为用户需要。
软件环境
Windows 2003 ServerOracle 11g Release 1 (11.1)
简单演示 Oracle 数据库并发导致行级锁
首先,打开一个会话 session 1,执行如下操作:[code] [code]SQL> select distinct sid from V$mystat;
SID
----------
118
SQL> create table t (x int primary key);
表已创建。
SQL> insert into t values(1);
已创建 1 行。
SQL> update t set x=10 where x=1;
已更新 1 行。
SQL>
[/code]
[/code]
先查看本次会话的 SID,然后创建一个表 t,只有一个名为 x 的字段,且该字段为主键,插入一条数据,并更新该数据。
接下来,打开另一个会话 session 2:
[code] [code]SQL> select distinct sid from V$mystat;
SID
----------
137
SQL> update t set x=10 where x=1;
[/code]
[/code]
此时,该会话被“卡”在这里不动。只是光标一直在闪……因为,session 2 被 session 1 阻塞。
现在,查看锁定视图 V$LOCK。
[code] [code]SQL> select sid,type,id1,id2,lmode,request,block
2 from v$lock where sid in (118,137)
3 order by sid;
SID TYPE ID1 ID2 LMODE REQUEST BLOCK
---------- ----- ---------- ---------- ---------- ---------- ----------
118 TM 128105 0 3 0 0
118 AE 99 0 4 0 0
118 TX 262174 34335 6 0 1
137 TM 128105 0 3 0 0
137 AE 99 0 4 0 0
137 TX 262174 34335 0 6 0
已选择6行。
SQL>
[/code]
[/code]
说明:“TYPE”列表示锁的类型;“LMODE”列表示锁的模式;“ID1”和“ID2”列是锁的相关信息。“REQUEST”列是正在什么锁。
SID=118 是第一个会话,SID=137 是第二个会话。第三行,第一个会话 BLOCK=1 表示这个会话正在阻塞其他会话,LMODE=6 表示锁的模式,即行级排他锁。第六行,第二个会话 REQUEST=6 表示当前会话正在等待一个 LMODE=6 的锁。注意,第三行和第六行的 ID1 和 ID2 列完全相同。因为它们指向统一资源,只不过一个是资源的拥有者(SID=118),一个是资源的等待者(SID=137)。
通过这个视图,很容易发现所在——故障定位(trouble shooting)。会话 2 之所以被“卡”住,是因为会话 1 还没提交,而在这张表上,又恰好有要求列值唯一性约束。
通过 SID 号,查看视图 V$SESSION 就可以确定用户信息。
[code] [code]SQL> select machine from v$session where sid in (118,137);
MACHINE
----------------------------------------------------------------
NUODE\LN
NUODE\LN
SQL>
[/code]
[/code]
因为,两个会话是同一台机器,所以名字一样。
相关文章推荐
- Oracle 数据库针对表主键列并发导致行级锁简单演示
- 简单演示 Oracle 数据库并发导致段级锁(表级锁)
- 简单处理K->V缓存失效后高并发访问导致数据库负载急剧上升的问题
- maven项目:spring配置里:连接远程oracle(虚拟机里),【虚拟机没开启(数据库连接不上)导致tomcat启动失败(web.xml配置Spring了监听器)】=(也不报具体错误,就是超时)
- Oracle数据库案例整理-Oracle系统运行时故障-Shared Pool内存不足导致数据库响应缓慢
- ASP.NET文件下载简单实现(也可以通过直接读取数据库 大字段文件,如oracle 中的bolg,long raw 等大字段文件)
- ORACLE 数据库逻辑备份 简单 EXP/IMP
- Windows7蓝屏导致Oracle回滚段损坏(ORA-01115和ORA-27070)数据库无法启动的问题处理
- 高并发压力下导致数据库bug
- ORACLE 数据库逻辑备份 简单 EXP/IMP
- java编写ajax超简单通讯录项目(数据库为oracle)
- 并发事务下各数据库外部表现实测之二(Oracle篇)
- windows下手动创建最简单的数据库(oracle 10.1.0)
- Oracle 9i 数据库 数据导入和导出的最简单的方法
- XML文档数据库--schema约束简单演示
- 比较简单windows系统不用RMAN的oracle数据库热备脚本(转载)
- Django简单数据库交互演示
- 数据库迁移之从oracle 到 MySQL最简单的方法
- oracle实现远程连接超简单;枚举与剪枝();PowerDesigner生成数据库代码注意里面的双引号,应该去掉