insert遭遇阻塞
insert的阻塞确实不常见,今天碰到了一个,看书又了解一个,整理下。
1、多个会话同时向unique字段插入相同的值
session1:
首先建测试表test,并在字段id上创建一个主键索引(唯一键也可以)。
SQL> create table test(id number,name char(1));
Table created.
SQL> insert into test values(1,'a');
1 row created.
SQL> rollback;
Rollback complete.
SQL> alter table test add constraint pk_test_id primary key(id);
Table altered.
SQL> insert into test values(1,'a');
1 row created.
SQL>
session2:
SQL> insert into test values(1,'b');
session2的insert被阻塞。
如果应用确实需要生成主键或唯一键,可以采用序列生成。
2、主外键关系的表可能会相互阻塞
将1中创建的test表作为父表,再创建一个子表,如test_sun。
session1:
SQL> create table test_sun(id number,name char(1));
Table created.
SQL> alter table test_sun add constraint fk_test_sun_id foreign key(id) references test(id);
Table altered.
SQL> delete from test where id=1;
1 row deleted.
SQL>
session2:
SQL> insert into test_sun values(1,'c');
session2 被阻塞。
测试发现,当在一个会话中对子表插入一行(2,'d'),也会阻塞对父表delete from test where id=1;
查锁等待为:
SQL> select event,blocking_session,row_wait_obj#,sid,serial# from v$session where username=user and status='ACTIVE';
EVENT BLOCKING_SESSION ROW_WAIT_OBJ# SID SERIAL#
---------------------------------------------------------------- ---------------- ------------- ---------- ----------
enq: TM - contention 38 13892 1 29
SQL> select object_id,object_name from dba_objects where object_id=13892;
OBJECT_ID OBJECT_NAME
---------- --------------------------------------------------------------------------------------------------------------------------------
13892 TEST_SUN
SQL> select * from dba_waiters;
WAITING_SESSION HOLDING_SESSION LOCK_TYPE MODE_HELD MODE_REQUESTED LOCK_ID1 LOCK_ID2
--------------- --------------- -------------------------- ------------------------------- ---------------------------------------- ---------- ----------
1 38 DML Row-X (SX) Share 13892 0
可以看到,父表正被子表test_sun阻塞,子表加的是一个行锁。
但是因为有主外键关系,主表必须保证子表的值都在主表里,所以必须能确定子表的值后才能做出回应,否则就处于等待状态了。 经测试发现:
因为主外表关系,导致主表必须保证子表的值都是主表里。当删除数据时,如果保证不报错,必须先删除子表数据再删除主表数据,插入数据时,必须先插入主表再插入子表。
1、删除时,先删除子表不提交或回滚,然后删除主表,会发现删除主表的会话处于等待。
2、插入时,先插入主表不提交或回滚,然后插入子表,会发现插入子表的会话处于等待。
insert遭遇阻塞的更多相关文章
- 实战演示疑惑 mysql insert到底加什么锁
innodb的事务隔离级别是可重复读级别且innodb_locks_unsafe_for_binlog禁用,也就是说允许next-key lock 实验来自网上. ( 如果你没有演示出来,请check ...
- 瘋耔java语言笔记
一◐ java概述 1.1 ...
- HANA SQL
约束 注释 你可以给你的 SQL 语句添加注释来增加可读性和可维护性. SQL 语句中注释的分隔如下: l 双连字符“--”.所有在双连字符之后直到行尾的内容都被 SQL 解析器认为是注释. l ...
- oracle报错:ORA-00054: 资源正忙,要求指定 NOWAIT
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源: --首先得到被锁对象的session_idselect session_id from v$locked_object; -- ...
- oracle之报错:ORA-00054: 资源正忙,要求指定 NOWAIT
oracle之报错:ORA-00054: 资源正忙,要求指定 NOWAIT 问题如下: SQL> conn scott/tiger@vm_database Connected to Oracle ...
- Oracle锁的机制
一.为什么要有锁的机制 我们都知道数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破 ...
- ABAP锁、数据库锁
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- MySQL auto_increment实现
http://www.cnblogs.com/xpchild/p/3825309.html 运维的时候,经常遇到auto_increment的疑惑: 机器异常crash,重启后id回退的问题 性能考虑 ...
- oracle之报错:ORA-00054: 资源正忙,要求指定 NOWAIT_数据库的几种锁
问题如下: SQL> conn scott/tiger@vm_databaseConnected to Oracle Database 11g Enterprise Edition Releas ...
随机推荐
- netbeans下将全部jar包打成一个,俗称fat jar
netbeans的java项目中.默认会将配置好的外部引用jar包,复制到dist文件夹的lib文件夹中去.假设须要公布出去.就须要将dist文件夹生成的jar和lib文件夹都拷贝出去公布,不方便. ...
- Android+OpenCV 摄像头实时识别模板图像并跟踪
通过电脑摄像头识别事先指定的模板图像,实时跟踪模板图像的移动[用灰色矩形框标识] ps:一开始以为必须使用OpenCV Manager,可是这样会导致还需要用户去额外安装一个apk,造成用户体验很差, ...
- SilkTest天龙八部系列1-初始化和构造函数
SilkTest没有提供专门的构造函数机制,但是在类对象生成的过程中,会先初始化在类中申明的变量.我们可以在初始化该变量的时, 调用某些函数完成对象初始化工作,看上去好像是调用了构造函数一样.不过要记 ...
- file is missing from source location:c\temp\batang.ttc
打开注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink 在右侧找到 Micr ...
- struts2拦截器的实现原理
拦截器(interceptor)是Struts2最强大的特性之一,也可以说是struts2的核心,拦截器可以让你在Action和result被执行之前或之后进行一些处理.同时,拦截器也可以让你将通用的 ...
- Linux SSh scp使用【远程文件/目录的传输】
一:Linux ssh scp的简介及作用: scp就是secure copy的简写,用于在linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器. 有时我们 ...
- photoshop 常用快捷键大全
一.文件新建 CTRL+N打开 CTRL+O 打开为 ALT+CTRL+O关闭 CTRL+W保存 CTRL+S 另存为 CTRL+SHIFT+S另存为网页格式 CTRL+ALT+S打印设置 CTRL+ ...
- Es6 之for of
能工摹形,巧匠窃意. -- 毕加索 2016-10-10 <!DOCTYPE HTML> <html> <head> <script src="tr ...
- JAVA Oauth 认证服务器的搭建
http://blog.csdn.net/binyao02123202/article/details/12204411 1.软件下载 Oauth服务端: http://code.google.com ...
- 20151215jqueryUI--dialog代码备份
$(function () { $('#search_button').button(); /*$('#reg_a').click(function() { $('#reg').dialog(); } ...