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遭遇阻塞的更多相关文章

  1. 实战演示疑惑 mysql insert到底加什么锁

    innodb的事务隔离级别是可重复读级别且innodb_locks_unsafe_for_binlog禁用,也就是说允许next-key lock 实验来自网上. ( 如果你没有演示出来,请check ...

  2. 瘋耔java语言笔记

    一◐ java概述                                                                                        1.1 ...

  3. HANA SQL

    约束 注释 你可以给你的 SQL 语句添加注释来增加可读性和可维护性. SQL 语句中注释的分隔如下: l  双连字符“--”.所有在双连字符之后直到行尾的内容都被 SQL 解析器认为是注释. l  ...

  4. oracle报错:ORA-00054: 资源正忙,要求指定 NOWAIT

    ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源: --首先得到被锁对象的session_idselect session_id from v$locked_object; -- ...

  5. oracle之报错:ORA-00054: 资源正忙,要求指定 NOWAIT

    oracle之报错:ORA-00054: 资源正忙,要求指定 NOWAIT 问题如下: SQL> conn scott/tiger@vm_database Connected to Oracle ...

  6. Oracle锁的机制

    一.为什么要有锁的机制 我们都知道数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破 ...

  7. ABAP锁、数据库锁

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  8. MySQL auto_increment实现

    http://www.cnblogs.com/xpchild/p/3825309.html 运维的时候,经常遇到auto_increment的疑惑: 机器异常crash,重启后id回退的问题 性能考虑 ...

  9. oracle之报错:ORA-00054: 资源正忙,要求指定 NOWAIT_数据库的几种锁

    问题如下: SQL> conn scott/tiger@vm_databaseConnected to Oracle Database 11g Enterprise Edition Releas ...

随机推荐

  1. 【solr基础教程之九】client

    一.Java Script 1.因为Solr本身能够返回Json格式的结果,而JavaScript对于处理Json数据具有天然的优势,因此使用JavaScript实现Solrclient是一个非常好的 ...

  2. Ubuntu 12.04 64bit 配置完android 5.0编译环境后出现“could not write bytes: Broken pipe.”而无法进入输入帐号密码的登陆界面

    Ubuntu 12.04 64bit 配置完android 5.0编译环境后出现“could not write bytes: Broken pipe.”而无法进入输入帐号密码的登陆界面.上网问了问百 ...

  3. [Node.js] Creating JWTs (JSON Web Tokens) in Node

    In this lesson we will look at all of the pieces that combine together to create a JWT (j AWT) or JS ...

  4. Apache的prefork模式和worker模式(转)

    prefork模式这个多路处理模块(MPM)实现了一个非线程型的.预派生的web服务器,它的工作方式类似于Apache 1.3.它适合于没有线程安全库,需要避免线程兼容性问题的系统.它是要求将每个请求 ...

  5. Java基础知识强化之IO流笔记61:输入流 和 输出流 使用总结

    1. 结构: 字节流:InputStream,OutputStream 字符流:Reader,Writer 2. 字符流 和 字节流: (1)Reader:读取字符流的抽象类 BufferedRead ...

  6. html笔记04:在html之中导入css两种常见方法

    1.导入式: <html> <head> <title></title> <style type="text/css"> ...

  7. 写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID可能不是连续的。

    答:解1:  select top 10 * from A where id not in (select top 30 id from A) 解2:  select top 10 * from A ...

  8. 简单的实现QQ通信功能(三)

    第三部分:登陆界面的设计及代码 一:效果图及界面设计 1. 效果图: 2. 界面设计: (1)仿照QQ的登陆界面,右上角放了三个Label,用来做关闭.最小化和设置,使用了它们的Click事件当做按钮 ...

  9. 20160406javaweb JDBC 实例工具类

    一.建立静态的数据库配置文件: config.properties driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/datab ...

  10. Highcharts在IE中不能一次性正常显示的一种解决办法

    由于客户要求必须在IE浏览器下兼容图表,故选用了兼容性较好的Highcharts.另外说一句,博主尝试过ichartjs.ECharts.YUI,兼容性都没有Highcharts给力(所有的兼容性问题 ...