设为首页 收藏本站
查看: 724|回复: 0

[经验分享] 《Oracle 9i&10g 编程艺术》读书笔记——事务

[复制链接]

尚未签到

发表于 2016-7-24 10:54:36 | 显示全部楼层 |阅读模式
原帖地址:[http://www.cnblogs.com/qmxle/archive/2009/06/05/Oracle_transaction.html]

1、Oracle并发控制的基础,是多版本。
2、Oracle保证读一致性,并且永远都不会脏读(即读其他事务的未提交数据)。Oracle查询得到的结果集肯定是某个时间点的当前结果集:
i. 游标(cursor)打开时的时间点。
ii. 语句开始执行时的时间点。Oracle总是保证语句级的读一致性。
iii. 查询所属事务开始的时间点。当事务隔离级别是serializable或read only时。
3、Oracle中的查询,不会被写入阻塞,Oracle中没有读共享锁。并且Oracle的非阻塞读,不是以脏读为代价的:Oracle永远都不会脏读(第2条)。
4、Oracle提供了read committed、serializable和read only三种事务隔离级别。
i. Oracle不需要read uncommited级别,Oracle不允许脏读。因为Oracle不需要脏读,就完全可以得到脏读的好处(即无阻塞读)。
ii. read committed是oracle的默认隔离级别,也是最常用的隔离级别。SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
iii. Oracle没有提供read repeatable隔离级别。
1. Oracle不使用共享读锁就保证了读一致性,更具并发性。
2. Oracle在非serializable和read only隔离级别下,没法保证不产生丢失更新。需要采用锁定来解决。(第5条)
iv. Oracle实现serializable隔离级别,就是把通常在语句级得到的读一致性扩展到事务级。Oracle采用了一种乐观的方法来实现serializable隔离级别,它认为本事务想要更新的数据不会被其他事务所更新。如果被更新了,Oracle就会产生ORA-08117错误。
v. read only隔离级别就是只读的serializable隔离级别。用于为报表查询需求提供支持。在serializable和read only隔离级别中,如果重建数据所需的undo信息已经被回绕而不存在了,则会产生ORA-1555错误。
5、Oracle的多版本读一致性,需要使用锁定来解决顺序读问题。
i. 悲观锁定:仅用于有状态或有连接环境。select … for update [nowait]。如果指定nowait,则如果其他事务正在更新或已经更新了这一行,则会产生ORA-00054错误;如果不指定nowait,则会一直等待下去。
ii. 乐观锁定:
1. 乐观锁定,如果发现数据已经被修改,那么要根据实际业务需求,来采取措施:
a) 获取新值,重新开始。
b) 根据业务规则解决更新冲突,试图合并两个更新的值。
2. 实现乐观锁定的方法:更新时,除了主键作为条件,另外增加一个条件。判断更新行数,如果是0行,说明数据已经改变。
a) 保存所有字段的旧值,作为更新条件。注意NULL值的判断。最简单的方法,不需要额外增加列。
b) 增加一个版本列,每次更新加1。适用于非10g的新表。
c) 增加一个时间戳列(TIMESTAMP),为最后一次更新时间。如果这个时间戳没有业务意义,建议用存储过程封装更新。适用于非10g的新表,并且可以获得得到最后一次更新时间的额外好处。
d) 使用所有字段校验和的旧值。不需要额外增加列,但是计算大字段时性能低下。
e) 使用Oracle 10g新提供的ORA_ROWSCN。为了避免“假报警”,需要带上ROWDEPENDENCIES重建数据库表。不需要额外增加列,轻量级。
6、Oralce的多版本读一致性,可能造成小的“热表”上的大量IO。方法就是减少事务执行时间。运行的时间越长,也就需要更多的IO来读取undo中的旧数据,这是一个恶性循环。
7、写阻塞:
i. 两个会话同时插入(insert)一行,主键或有唯一约束的列值相同。通过使用序列(sequence)产生主键,避免了一半问题。
ii. 如果update或delete产生阻塞,则说明程序可能丢失问题的BUG。
8、写一致性:为了保证写一致性,Oracle可能会悄悄的回滚更新,并重新启动。这会导致BEFORE触发器执行两次。方法就是不在BEFORE触发器中使用自治事务,和执行非事务性语句。
9、死锁:Oracle极少出现死锁。检测到死锁会产生ORA-00060错误。
10、 Oracle的约束,可以设置为deferrable。这样,可以设置约束为延迟状态(set constraint 约束名 deferred/immediate),来允许事务过程中的暂时违反约束。如外键的级联更新。
11、 在Oracle中,每个事务都应该只在必要时才提交,而在此之前不能提交。事务的大小要根据需求而定。锁、阻塞等问题并不是决定事务大小的关键,数据完整性才是确定事务大小的根本。
12、 rollback会做大量的工作,与rollback相比,commit完成的工作非常少。除非不得已,否则不希望回滚。常识是:既然不想commit,又何苦去做所有这些工作。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-248557-1-1.html 上篇帖子: ORACLE和DB2实现相同功能的做法(2) 下篇帖子: PL/SQL Developer 连接Oracle数据库配置方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表