并发事务下各数据库外部表现实测之二(Oracle篇)
来源:互联网 发布:软件开发是什么意思? 编辑:程序博客网 时间:2024/06/05 00:32
1. 测试环境
OS:RHEL6
DBMS:Oracle 11g
2. 测试结果t.163.com查询
读已提交:
先执行SQL\后执行SQL同一行查询非同行查询整表查询同一行插入非同行插入同一行更新非同行更新整表更新同一行删除非同行删除整表删除单行查询OKOKOK主键冲突OKOKOKOKOKOKOK整表查询OKOKOK主键冲突OKOKOKOKOKOKOK插入
OK(**)
OKOK(**)
等待(*)OKOK(**)OKOK(**)OK(**)OKOK(**)单行更新OK(**)
OKOK(**)
主键冲突OK等待(*)OK等待(*)等待(*)OK等待(*)整表更新OK(**)
OKOK(**)
主键冲突OK等待(*)OK等待(*)等待(*)OK等待(*)单行删除OK(**)
OKOK(**)
等待(*)OK等待(*)OK等待(*)等待(*)OK等待(*)整表删除OK(**)
OKOK(**)
等待(*)OK等待(*)OK等待(*)等待(*)OK等待(*)OK(**):基于更新前的数据,即看到是查询时的快照等待(*):如果先行的SQL提交,则基于更新后的数据,否则基于原来的数据
注:黄色代表和SQL Server 的READ_COMMITTED_SNAPSHOT=ON时的读已提交不同的地方
从上面的表可以看出,Oracle 的读已提交比SQL Server的READ_COMMITTED_SNAPSHOT=ON时的读已提交基本上差不多,但处理插入时阻塞的可能性更小。
可串行化:
先执行SQL\后执行SQL同一行查询非同行查询整表查询同一行插入非同行插入同一行更新非同行更新整表更新同一行删除非同行删除整表删除单行查询OKOKOK主键冲突OKOKOKOKOKOKOK整表查询OKOKOK主键冲突OKOKOKOKOKOKOK插入
OK(***)
OKOK(***)
等待(*)OKOK(***)OKOK(***)OK(***)OKOK(***)单行更新OK(***)
OKOK(***)
主键冲突OK等待(**)OK等待(**)等待(**)OK等待(**)整表更新OK(***)
OKOK(***)
主键冲突OK等待(**)OK等待(**)等待(**)OK等待(**)单行删除OK(***)
OKOK(***)
等待(*)OK等待(**)OK等待(**)等待(**)OK等待(**)整表删除OK(***)
OKOK(***)
等待(*)OK等待(**)OK等待(**)等待(**)OK等待(**)OK(***):基于更新前的数据,查询看到的是事务开始时的快照event等待(*):如果先行的SQL提交,则基于更新后的数据,否则基于原来的数据info
等待(**):如果先行的SQL提交,则报更新冲突的错误,"ORA-08177: 无法连续访问此事务处理"
注:黄色代表和读已提交不同的地方eventId
3. Oracle的串行化(SI)和真正串行化的区别
Oracle的串行化(SI)其实等同于SQL Server的SNAPSHOT,它满足SQL标准对可串行化的要求,但并不是真正的可串性化。下面用一个例子来说明。
/-5777896639697768785
/341018209886538040
/-248752558554698112
/3695141408112736151
/-7997662361159449950
/212821422613202010
/-294409163655268084
/4518187912517456276
/-6258722245610832837
/7555051128934922001
/-2563812029577661172
/-8987855923191418848
/-6535855513250128448
/7647637506402175787
/-5999989679990946649
/-524696247291654558
/4519174811055014556
/932422716846628974
/298578870777511097
/-4858117309282232497
/3581843498415465799
/-1130885605335979942
/4263705493882513384
/-1335960542939031169
/-483360142662101861
SI下,2个事务按下面的顺序交替执行,可以执行成功。
SI下,2个事务按下面的顺序交替执行,可以执行成功。
1) 事务1:select * from tb1;
2) 事务2:select * from tb1;
3) 事务1:insert into tb1 values(5,'a');
4) 事务2:insert into tb1 values(6,'a');
5) 事务1:commit;
6) 事务2:commit;
但是这不符合真正的串行化。如果2个事务按照 事务1->事务2 的顺序串行执行, 在2)中事务2应该能看到3)事务1插入的数据,这是不可能的;反之 事务2->事务1 亦然。
- 并发事务下各数据库外部表现实测之二(Oracle篇)
- oracle数据库事务并发操作
- 91.Oracle数据库SQL开发之 修改表内存——数据库事务的并发事务
- Oracle数据库之事务
- Oracle数据库之事务
- 数据库事务(二)
- 数据库事务(二)
- 【数据库之事务(一)】事务是什么,以及事务四个特性,以及事务并发问题和隔离级别
- 高并发下的数据库设计水平分区之二篇
- 数据库并发事务控制 二:mysql数据库锁机制
- 数据库事务隔离级别(二) 之 典例篇
- oracle 并发与事务
- oracle之数据库事务的边界(DML,DDL,DCL)
- 数据库--事务(定义、基本特征、并发问题)
- 数据库事务和并发
- 数据库 事务并发控制
- 数据库事务并发:概述
- 数据库事务与并发
- Google 正在悄悄解决 Android 的碎片化
- Android---显示卡片翻转的动画效果
- 程序员解决问题的方法
- java 设计模式原型模式(5)
- 2013年ACM网络赛成都赛区
- 并发事务下各数据库外部表现实测之二(Oracle篇)
- asp.net 的生命同期
- linux下的rpm包在安装时如何来指定安装路径!
- EAS7.5 在linux 6.4 x86_64位系统上安装的常见问题
- chrome快捷方式
- 金山词霸,你也太会紧跟潮流了!!
- 给Repeater控件里添加序号的5种方法
- CListView使用大全
- ffmpeg编译错误