当前位置: 移动技术网 > IT编程>数据库>Oracle > Oracle 数据库针对表主键列并发导致行级锁简单演示

Oracle 数据库针对表主键列并发导致行级锁简单演示

2017年12月12日  | 移动技术网IT编程  | 我要评论

今日油价查询,李宗瑞继母是第几部,歌手2018第五期

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

软件环境
--------------------------------------------------------------------------------
•windows 2003 server
•oracle 11g release 1 (11.1)
简单演示 oracle 数据库并发导致行级锁
首先,打开一个会话 session 1,执行如下操作:

复制代码 代码如下:

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>

先查看本次会话的 sid,然后创建一个表 t,只有一个名为 x 的字段,且该字段为主键,插入一条数据,并更新该数据。

接下来,打开另一个会话 session 2:
复制代码 代码如下:

sql> select distinct sid from v$mystat;

sid
----------
137
sql> update t set x=10 where x=1;

此时,该会话被“卡”在这里不动。只是光标一直在闪……因为,session 2 被 session 1 阻塞。
现在,查看锁定视图 v$lock。
复制代码 代码如下:

sql> select sid,type,id1,id2,lmode,request,block
2 from v$lock where sid in (118,137)
3 order by sid;

 
已选择6行。
sql>
说明:“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 就可以确定用户信息。
复制代码 代码如下:

sql> select machine from v$session where sid in (118,137);

machine
----------------------------------------------------------------
nuode\ln
nuode\ln
sql>

因为,两个会话是同一台机器,所以名字一样。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网