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 ...
随机推荐
- 关于模拟器不能运行项目问题:Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE
我有一个习惯,当做完某一项功能时就想试试运行效果.所以一个程序完成前会运行无数遍.但是有时会出现不能运行的问题,并且这个问题不是来自项目的错误,显示器显示如下错误: [2013-08-31 08:45 ...
- [Whole Web] [AngularJS + Grunt] Using ng-html2js to Convert Templates into JavaScript
ng-html2js takes .html templates and converts them into strings stored in AngularJS's template cache ...
- [分享]Ubuntu12.04安装基础教程(图文)
[分享]Ubuntu12.04安装基础教程(图文) 原文地址: http://teliute.org/linux/Ubsetup/lesson21/lesson21.html 1.进入 live cd ...
- STM32F030 IO口外部中断应用
//==文件exit.h============================================================ #ifndef __EXIT_H #define __ ...
- Linux--------------安装nginx ftp
阿里云服务器ECS centos7.2搭建nginx环境以及负载均衡 http://blog.csdn.net/ul646691993/article/details/52104082
- hdu1047(Java)大数相加
题目大意:输入n组数据,每组数据中又有若干长度不大于100的整数,以0结束每组数据的输入,求每组中数据之和.每两组数据输入之间有一行空格,输出也是如此. Integer Inquiry Time Li ...
- 利用Qt制作一个helloworld
使用QT创建第一个 工程: 1.打开应用程序: 2.单击画面中间偏上的 New Project按钮.[要学习使用啊~,传说它的跨平台行很好,QQ就是用它编辑的.] 3.直接点击右下角的选择 按钮. 4 ...
- window nodejs 版本切换 nvmw
参考文档:https://cnodejs.org/topic/5338c5db7cbade005b023c98 nvmw 下载到本地 git clone https://github.com/hako ...
- SQL Server数据的导入导出
SQL Server 2008的导入导出服务可以实现不同类型的数据库系统的数据转换.为了让用户可以更直观的使用导入导出服务,微软提供了导入导出向导.导入和导出向导提供了一种从源向目标复制数据的最简便的 ...
- .NET程序编译原理
导语: CPU只认识二进制代码,那么C#源代码是怎样变成CPU可识别的二进制代码的呢? 步骤如下: 1.C#源码 2.运用VS自带的命令提示窗口,使用csc命令将C#源码转成程序集(EXE文件或DLL ...