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

本文内容
•软件环境
•简单演示 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>

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

时间: 2024-10-26 09:03:45

Oracle 数据库针对表主键列并发导致行级锁简单演示_oracle的相关文章

如何区分SQL数据库中的主键与外键_MsSql

一.什么是主键.外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键比如 : 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的,学号就是一个主键 用户表(用户名.密码.登录级别) 其中用户名是唯一的, 用户名就是一个主键 上机记录表(卡号,学号,姓名.序列号) 上机记录表中单一一个属性无法唯一标识一条记录,学号和姓名的组合才可以唯一标识一条记录,所以 学号和姓名的属性组是一个主键 上机记录表中的序列号不是成绩表的

如何区分SQL数据库中的主键与外键

一.什么是主键.外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键比如 : 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的,学号就是一个主键 用户表(用户名.密码.登录级别) 其中用户名是唯一的, 用户名就是一个主键 上机记录表(卡号,学号,姓名.序列号) 上机记录表中单一一个属性无法唯一标识一条记录,学号和姓名的组合才可以唯一标识一条记录,所以 学号和姓名的属性组是一个主键 上机记录表中的序列号不是成绩表的

visual studio-vs怎么样代码获取Mysql数据库中的主键

问题描述 vs怎么样代码获取Mysql数据库中的主键 100C 我正在做代码生成器,其中要获取数据库中的主键和外键以及自动增加列.下面是具体的代码,给位大神们我应该怎样升级这个代码 解决方案 解决方案二: 解决方案三: SELECT k.column_nameFROM information_schema.table_constraints tJOIN information_schema.key_column_usage kUSING (constraint_nametable_schemat

用linq增加数据时"服务器无法生成类型为“TinyInt”的主键列。"

问题描述 我的数据库一张表中设置了id为主键,类型为tinyint,允许为空,并且是把它做为了一个自增的标识符,当我在vs2008中把表拖进来写好代码增加记录的时候出现了"服务器无法生成类型为"TinyInt"的主键列."我查看了一下自动生成的代码如下[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_id",AutoSync=AutoSync.OnInsert,DbType=&

ado.net-c#通过SqlDataAdapter获取数据库数据,主键自增长值与datatable内对应字段值不同

问题描述 c#通过SqlDataAdapter获取数据库数据,主键自增长值与datatable内对应字段值不同 当删除表内最后一条数据后,通过SqlDataAdapter增加一条数据.表主键ID的值比SqlDataAdapter操作的datatable内ID多1. 问题关键是,当我要删除一行记录时,datatable的ID也就不能当做条件来用了,他的值不一定是正确的. 解决方案 参考:http://blog.csdn.net/pfe_Nova/article/details/41378819 解

数据库里修改主键名称

问题描述 数据库里修改主键名称 怎么修改表的主键名称? 创建主键时出错了 invalid ALTER TABLE option, 其他的可以创建,这是什么问题?大神 求解 解决方案 你用的什么数据库 解决方案二: 主键名称合法不,主键名称重复超过2次没 解决方案三: 先删除主键约束,在修改字段,之后再加上主键

是不是用JAVA做的BS项目里 javabean就对应数据库一个表 javabean必须有一个主键ID 对应数据库里表的主键 是这样吗

问题描述 是不是用JAVA做的BS项目里javabean就对应数据库一个表javabean必须有一个主键ID对应数据库里表的主键是这样吗 解决方案 解决方案二:请教各位大牛一下是这样的吗解决方案三:没人指点下嘛解决方案四:不是必须的.主要看业务.解决方案五:引用3楼chouy的回复: 不是必须的.主要看业务. 那hibernate不是都要指定主键生成器吗解决方案六:这样做最好了,省的想太多,如果某些表的某些字段经常使用,也可以考虑抽取出来解决方案七:最好指定ID

mysql主键的缺少导致备库hang

最近线上频繁的出现slave延时的情况,经排查发现为用户在删除数据的时候,由于表主键的主键的缺少,同时删除条件没有索引,或或者删除的条件过滤性极差,导致slave出现hang住,严重的影响了生产环境的稳定性,也希望通过这篇博客,来加深主键在innodb引擎中的重要性,希望用户在使用RDS,设计自己的表的时候,一定要为表加上主键,主键可以认为是innodb存储引擎的生命,下面我们就来分析一下这个案例(本案例的生产环境的binlog为row模式,对于myisam存储引擎也有同样的问题): (1).现

mysql主键的缺少导致备库hang住_Mysql

最近线上频繁的出现slave延时的情况,经排查发现为用户在删除数据的时候,由于表主键的主键的缺少,同时删除条件没有索引,或或者删除的条件过滤性极差,导致slave出现hang住,严重的影响了生产环境的稳定性,也希望通过这篇博客,来加深主键在innodb引擎中的重要性,希望用户在使用RDS,设计自己的表的时候,一定要为表加上主键,主键可以认为是innodb存储引擎的生命,下面我们就来分析一下这个案例(本案例的生产环境的binlog为row模式,对于myisam存储引擎也有同样的问题):(1).现象