Oracle同时插入同一行记录时产生阻塞的处理分析

(4号锁分析之Unique key的约束)

之前有个客户提出,在insert的时候被hang住了,碰到这样的问题很可能是锁的问题。对于这样的问题我一般就会想到几个常用的视图:v$lock/v$transaction/v$session/v$sql,仔细观察就可以查出问题的所在。

好,那我们现在去分析一下上面的现象,分析问题的一个常规手段就是能模拟故障的重现,我来试试模拟一下:

1.查出当前操作的会话号为125

SQL> select sid from v$mystat where rownum=1;

SID

----------

125

 

2.创建表及插入数据

SQL>  create table t_gyj(id int primary key,name varchar2(10));

Table created.

SQL> insert into t_gyj values(1,'gyj1');

1 row created.

注意这里先不要commit(提交).

3.再开一个会话,会话号为17

SQL> select sid from v$mystat where rownum=1;

SID

----------

 17  

4.在17号会话上插入同样的一条记录,这时被阻塞了.

SQL> insert into t_gyj values(1,'gyj1');

这里就出现了上面提到的同时插入同一行记录,产生阻塞的现象,现象出现我们如何判断分析呢?

5.开始分析,刚刚提到几个视图v$lock,v$transaction,v$session,v$sql,这几个视图是DBA必须的.

为了方便查询,我在上面的操作特意把会话号给显示一下125号和17号会话.

被阻塞了我们一般首先会想到是不是锁住了

OK,我再开一个会话:

SQL>  select sid from v$mystat where rownum=1;

SID

----------

 19

SQL> set linesize 1000

SQL>  select * from v$lock where sid in (125,17);

ADDR             KADDR                   SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK

---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------

00000003A445F998 00000003A445F9F0        125 AE        100          0          4          0        883          0

00000003A44601D0 00000003A4460228         17 AE        100          0          4          0        595          0

00000003A44602A0 00000003A44602F8         17 TX     327681       1022          0          4        474          0

FFFFFD7FFC9F2040 FFFFFD7FFC9F20A0         17 TM      74868          0          3          0        474          0

FFFFFD7FFC9F2040 FFFFFD7FFC9F20A0        125 TM      74868          0          3          0        565          0

00000003A2CFF908 00000003A2CFF980         17 TX     458765        764          6          0        474          0

00000003A2D3E928 00000003A2D3E9A0        125 TX     327681       1022          6          0        565          1

时间: 2024-09-20 05:38:43

Oracle同时插入同一行记录时产生阻塞的处理分析的相关文章

c#-C#向oracle插入多条记录

问题描述 C#向oracle插入多条记录 我需要把这个 richTextBox2中的5条数据,一行一行的插入到oracle中,命令如下: int linecount = richTextBox2.Lines.Length; for (int o = 0; o <= linecount - 1; o++) { string linestr = ""; linestr = richTextBox2.Lines[o]; OracleConnection con = new Oracle

oracle可以一次性插入多条记录吗?

问题描述 oracle可以一次性插入多条记录吗? 而且数据还是有重复的,比如说要插入一个日期和一个上班状况,日期是主键,数据是:2015-05-10,请假:2015-05-11,请假:2015-05-12,请假.本来用的是insert into ... select...from dual union select......,但是报错违反唯一约束条件 刚开始做.不太会还请指教 解决方案 为什么要用日期当主键啊...不会重复么??? 解决方案二: insert into table(...)se

利用hibernate生成表时的同时能不能自动向表中插入一条记录

问题描述 利用hibernate生成表时的同时能不能自动向表中插入一条记录 解决方案 解决方案二:生成后直接跟一条插入语句.

mysql中插入记录时不存在时插入已经存在则更新

如果您指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执 行旧行UPDATE.例如,如果列a被定义为UNIQUE,并且包含值1,则以下两个语句具有相同的效果: 代码如下:  代码如下 复制代码 mysql> INSERT INTO table (a,b,c) VALUES (1,2,3) -> ON DUPLICATE KEY UPDATE c=c+1; mysql> UPDATE table SET

使用jdbc向数据库插入100000条记录

分别使用statement,PreparedStatement,及PreparedStatement+批处理3种方式进行测试: //1.使用statement插入100000条记录  Java代码   public void exec(Connection conn){      try {       //开始时间      Long beginTime = System.currentTimeMillis();       //设置手动提交       conn.setAutoCommit(

mysql sql 防止重复插入相同的记录实例

mysql教程 sql 防止重复插入相同的记录实例 首页我们来看看防止页面重复刷新插入防止方法 方法: 表单页setcookie("pass","ok"); 处理页 if($_COOKIE["pass"]=="ok"){ mysql_query("insert inot ....."); } else{   echo "页面已经过期,请不要重复刷新";   exit; } setcook

全面解决--如何获得刚插入数据库的记录的ID号?

插入|解决|数据|数据库 如何获得刚插入数据库的记录的ID号? 1.SQL Server 对于SQL Server 2000来说,它提供了两个全新的函数(IDENT_CURRENT,SCOPE_IDENTITY),并且改进了@@IDENTITY的不足.当你插入新记录后,可以调用函数: PRINT IDENT_CURRENT('table') '这将获得新的IDENTITY值,不管数据库中是不是有记录添加(这就避免了@@IDENTITY的连接限制) 或者:PRINT SCOPE_IDENTITY(

看实例学VFP:向数据表中添加记录时自动生成编号

本例在"看实例学VFP:向数据表中添加记录并验证输入数据是否合法"的基础上进行了改进,实现了在添加记录时不仅能够完成对输入数据的校验,还具有自动生成编号的功能.自动生成编号的相关代码加在表单的init事件及"添加"按钮的click中,在表单第一次启动或添加完记录后都会调用此段代码,实现自动生成编号的功能.运行界面如下: 本例用到了"数据1"数据库中的"网站信息表",关于该数据库的情况已经在看实例学VFP:示例数据库一文中给出,

ASP.NET 2.0数据教程之五十六:添加新记录时包含一个文件上传选项

返回"ASP.NET 2.0数据教程目录" 导言: 在前面2节教程,我们探讨了如何使用FileUpload控件从客户端 向服务器上传文件,以及如何在数据Web控件里显示二进制数据. 在本节 ,我们将创建一个web页面以添加新的种类.除了为类的name和description属性 添加TextBoxes控件外,我们还要在页面上添加2个FileUpload控件 --一个用来上传新类的图片,另一个用来上传类的小说明册子.上 传的图片将直接存储在新记录的Picture列.与此相反,小册子将存储