insert到主键或唯一约束表的阻塞情况测试
2013-10-17 16:03
239 查看
了解各类场景下锁、等待事件的特征,有助于快速定位生产问题。
创建测试表
两个session插入同样的值到主键、唯一约束字段中,session1能完成,session2失败报唯一约束失败。
session1
执行insert测试语句
查看锁情况
session2
执行insert测试语句
查看等待事件v$session_wait
直到session1完成insert后,session2返回错误:
场景二:
两个线程插入不同的值到主键、唯一约束字段中,均能完成。
session1
执行测试sql
session2
执行测试sql
本文出自 “DBA的随笔记录” 博客,请务必保留此出处http://ck1985.blog.51cto.com/4539614/1310431
创建测试表
create table testf ( a varchar(255), b varchar(255), c varchar(255), d varchar(255), e varchar(255), f varchar(255), g varchar(255), h varchar(255), i varchar(255), j varchar(255), k varchar(255), l varchar(255), m varchar(255), n varchar(255), o varchar(255), p varchar(255), q varchar(255), r varchar(255), s varchar(255), t varchar(255), u varchar(255), v varchar(255), w varchar(255), x varchar(255), y varchar(255), z varchar(255) );添加主键约束
alter table testf add constraint pk_a primary key (a);场景一:
两个session插入同样的值到主键、唯一约束字段中,session1能完成,session2失败报唯一约束失败。
session1
执行insert测试语句
begin for x in 1..500000 loop insert into testf values (x,'aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa'); commit; end loop; end; /
查看锁情况
select * from v$lock; ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK ---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ---------- 0700000188A238A8 0700000188A238D0 519 TM 798999 0 3 0 26 0 0700000188ADE520 0700000188ADE558 519 TX 655367 33178285 6 0 26 0
session2
执行insert测试语句
begin for x in 1..500000 loop insert into testf values (x,'aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa'); commit; end loop; end; /查看锁情况
select * from v$lock; ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK ---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ---------- 0700000188A238A8 0700000188A238D0 519 TM 798999 0 3 0 18 0 0700000188A239A8 0700000188A239D0 524 TM 798999 0 3 0 5 0 0700000188ABFF40 0700000188ABFF78 524 TX 589843 30690293 6 0 5 0 0700000188ADEDC0 0700000188ADEDF8 519 TX 393234 23268430 6 0 18 1block=1出现阻塞线程
查看等待事件v$session_wait
SID USERNAME MACHINE EVENT P1TEXT P1 P2TEXT P2 WAIT_CLASS P3TEXT P3 STATE ---------- ---------- ---------- ------------------------------ ---------- ---------- ---------- ---------- --------------- ---------- ---------- ------------------- 519 SYS lpar2 buffer busy waits file# 1 block# 50800 Concurrency class# 1 WAITED SHORT TIME 524 SYS lpar2 enq: TX - row lock contention name|mode 1415053316 usn<<16 | 393234 Application sequence 23268430 WAITING slot 489 SYS lpar2 SQL*Net message to client driver id 1650815232 #bytes 1 Network 0 WAITED SHORT TIME
直到session1完成insert后,session2返回错误:
ERROR at line 1: ORA-00001: unique constraint (SYS.PKA) violated ORA-06512: at line 3
场景二:
两个线程插入不同的值到主键、唯一约束字段中,均能完成。
session1
执行测试sql
session 1
begin for x in 1..500000 loop insert into testf values (x,'aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa'); commit; end loop; end; /
session2
执行测试sql
begin for x in 1..500000 loop insert into testf values (x+500000,'aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa','aaaaaaaaaaaaaaa'); commit; end loop; end; /未见阻塞进程
select * from v$lock; ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK ---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ---------- 0700000188A238A8 0700000188A238D0 519 TM 798999 0 3 0 103 0 0700000188A239A8 0700000188A239D0 524 TM 798999 0 3 0 86 0 0700000188ABEE00 0700000188ABEE38 524 TX 655395 33173632 6 0 86 0 070000018AB3F708 070000018AB3F740 519 TX 524319 29519550 6 0 103 0查看等待事件
SID USERNAME MACHINE EVENT P1TEXT P1 P2TEXT P2 WAIT_CLASS P3TEXT P3 STATE ---------- ---------- ---------- ------------------------------ ---------- ---------- ---------- ---------- --------------- ---------- ---------- ------------------- 519 SYS lpar2 buffer busy waits file# 1 block# 66558 Concurrency class# 1 WAITED SHORT TIME 524 SYS lpar2 buffer busy waits file# 1 block# 66562 Concurrency class# 1 WAITED SHORT TIME 489 SYS lpar2 SQL*Net message to client driver id 1650815232 #bytes 1 Network 0 WAITED SHORT TIME最终均完成。
本文出自 “DBA的随笔记录” 博客,请务必保留此出处http://ck1985.blog.51cto.com/4539614/1310431
相关文章推荐
- SQL0803N INSERT 语句、UPDATE 语句或由 DELETE 语句导致的外键更新中的一个或多个值无效,因为由 "1" 标识的主键、唯一约束或者唯一索引将表
- 创建主键或唯一约束小技巧
- MySQL约束:非空约束、主键约束、唯一约束、默认约束、外键约束
- Oracle主键约束、唯一键约束、唯一索引的区别
- 测试以两个外键为复合主键的表,两个外键空值情况
- Oracle主键约束、唯一键约束、唯一索引的区别【主键约束和唯一键约束均会隐式创建同名的唯一索引】
- SQL Server 创建约束图解 唯一 主键
- SQLServer主键和唯一约束的区别
- oracle数据库主键约束删除之后依然报错ORA-00001: unique constraint(违反唯一约束)
- [置顶] T-sql sql server 设置主键约束、标示列、唯一约束、默认值、约束、创建表
- 基于主键和唯一约束的显示索引控制
- Oracle的主键约束、唯一约束与外键约束
- 唯一索引、主键、Unique约束
- SQL脚本创建数据表,并给出主键,外键,唯一键,约束
- ORA-02437: cannot validate(主键或唯一键约束名) - primary key violated
- SQL存储原理及聚集索引、非聚集索引、唯一索引、主键约束的关系
- 内、外、左、右连接、唯一,主键,外键约束
- 【SQL Server学习笔记】14:查漏补缺1(三值谓词,范式,主键/唯一/外键/检查/默认约束)
- mysql 主键约束与唯一约束的区别