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

[经验分享] 原创:oracle 事务总结<九>

[复制链接]

尚未签到

发表于 2016-7-25 09:33:17 | 显示全部楼层 |阅读模式
Code:


  • 1、事务概念:
  • 概念:在数据库中事务是工作的逻辑单元,一个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机制确保这一组SQL语句所作的操作要么完全成功执行,完成整个工作单元操作,要么一点也不执行。
  • 主要特性:确保数据库的完整性。
  • 2、事务的ACID特性
  • 对一组SQL语句操作构成事务,数据库操作系统必须确保这些操作的原子性,一致性,隔离性,持久性.
  • 1、原子性(Atomicity)
  • 事务的原子性是指事务中包含的所有操作要么全做,要么不做,也就是说所有的活动在数据库中要么全部反映,要么全部不反映,以保证数据库的一致性。
  • 2、一致性(Consistency)
  • 事务的一致性是指数据库在事务操作前和事务处理后,其中数据必须满足业务的规则约束。
  • 3、隔离性(Isolation)
  • 隔离性是指数据库允许多个并发的事务同时对其中的数据进行读写或修改的能力,隔离性可以防止多个事务的并发执行时,由于它们的操作命令交叉执行而导致数据的不一致性。
  • 4、持久性(durability)
  • 事务的持久性是指在事务处理结束后,它对数据的修改应该是永久的。即便是系统在遇到故障的情况下也不会丢失,这是数据的重要性决定的。



  • 3、事务的控制语句
  • 在oracle数据库中,没有提供开始事务处理语句,所有的事务都是隐式开始的,也就是说在oracle中,用户不可以显示使用命令来开始一个事务.oracle任务第一条修改数据库的语句,或者一些要求事务处理的场合都是事务的隐式开始。但是当用户想要终止一个事务处理时,必须显示使用commit和rollback语句结束。
  • 根据事务ACID属性,oracle提供了如下的事务控制语句:
  • Settransaction设置事物属性
  • Setconstrains设置事物的约束模式
  • 约束模式是指:在事务中修改数据时,数据库中的约束立即应用于数据,还是将约束推迟到当前事务结束后应用。
  • Savepoint在事务中建立一个存储的点.当事务处理发生异常而回滚事务时,可指定事务回滚到某存储点.然后从该存储点重新执行。
  • Releasesavepoint删除存储点
  • Rollback回滚事务取消对数据库所作的任何操作
  • Commit提交事务对数据库的操作做持久的保存。


  • 3、1设置事物的属性:
  • settransaction语句可用来设置事物的各种属性。该语句必须放在事务处理的第一个语句.
  • 也就是说,必须在任何insert、update、delete语句以及其他的事务处理。
  • Settransaction的语句可以让用户对事务的以下属性进行设置
  • 指定事务的隔离层
  • 规定回滚事务所使用的存储空间
  • 命名事务
  • 备注:在使用settransaction语句设置属性时,对于规定回滚事务所使用的存储空间的设置很少使用.对于命名事务也非常简单,只有在分布式事务处理中才会体现出命名事务的用途.

  • 注意:settransaction只对当前事务有效,事务终止,事务当前的设置将会失效。

  • 1、数据异常
  • 事务的隔离性定义了一个事务与其它事务的隔离程度.为了更好的理解隔离层,首先讨论一下并发事务对同一个数据库进行访问可能发生的情况.在并发事务中总体来说会发生如下3种情况
  • 错读|脏读
  • 非重复读取|不可重复读
  • 假读|幻读

  • 错读|脏读:当一个事务修改数据时,另一事务读取了该数据,但是第一事务由于某种原因取消对数据修改,使数据返回了原状态,这是第二个事务读取的数据与数据库中数据不一致.这就叫错读。

  • 非重复读取:是指一个事务读取数据库中的数据后,另一个事务则更新了数据,当第一个事务再次读取其中的数据时,就会发现数据已经发生了改变,这就是非重复读取。非重复读取所导致的结果就是一个事务前后两次读取的数据不相同。

  • 假读:如果一个事务基于某个条件读取数据后,另一个事务则更新了同一个表中的数据,这时第一个事务再次读取数据时,根据搜索的条件返回了不同的行,这就是假读。

  • 事务中遇到的这些异常与事务的隔离性设置有关,事务的隔离性设置越多,异常就出现的越少,但并发效果就越低,事务的隔离性设置越少,异常出现的越多,并发效果越高。
  • 2、选择隔离层
  • 针对3中读取的数据时产生的不一致现象,在ANSISQL标准92中定义了4个事务的隔离级别.如下图所示:
  • 隔离层错读|脏读非重复读取|不可重复读假读|幻读
  • READUNCOMMITTED(非提交读)是是是
  • READCOMMITTED(提交读)否是是
  • RepeatableREAD(可重复读)否否是
  • Serializable(串行读)否否否

  • Oracle支持上述四种隔离层中的两种:readcommitted和serializable。除此之外oralce中还定义readonly和readwrite隔离层。
  • Readcommitted这是oracle默认的隔离层。
  • Serializable:设置事物的隔离层位它时,事务与事务之间完全隔开,事务以串行的方式执行,这并不是说一个事务必须结束才能启动另外一个事务,而是说这些事务的执行的结果于一次执行的事务的结果一致。

  • Readonly和readwrite当使用readonly时,事务中不能有任何修改数据库中数据的操作语句,这包括insert、update、delete、create语句。Readonly是serializable的一个子集,区别是readonly只读,而serialzable可以执行DML操作。Readwrite它是默认设置,该选项表示在事务中可以有访问语句、修改语句.但不经常使用.



  • 3、建立settransaction的语句
  • 列举如下:
  • Settransactionreadonly
  • Settransactionreadwrite
  • Settransactionisolationlevelreadcommitted
  • Settransactionisolationlevelserializable

  • 注意:这些语句是互斥的.即不能够同时设置两个或者两个以上的选项。


  • 4、结束事务:
  • 什么情况下代表事务的结束呢?

  • 1、Commit提交事务
  • 2、rollback回滚事务

  • //只读的案例
  • SQL>settransactionreadonly;

  • Transactionset

  • SQL>select*fromuserswhereusername='mj';

  • USERNAMEPASSWORDNAMEADDRESSZIP
  • ---------------------------------------------------------------------------------------
  • mjredarmy陈红军

  • SQL>updateuserssetpassword='123'whereusername='mj';

  • updateuserssetpassword='123'whereusername='mj'

  • ORA-01456:不能在READONLY事务处理中执行插入/删除/更新操作

  • //脏读的案例
  • SQL>settransactionisolationlevelreadcommitted;

  • Transactionset

  • SQL>select*fromuserswhereusername='mj';

  • USERNAMEPASSWORDNAMEADDRESSZIP
  • ---------------------------------------------------------------------------------------
  • mjredarmy陈红军

  • SQL>updateuserssetpassword='123'whereusername='mj';

  • 1rowupdated

  • SQL>select*fromuserswhereusername='mj';

  • USERNAMEPASSWORDNAMEADDRESSZIP
  • ---------------------------------------------------------------------------------------
  • mj123陈红军

  • SQL>rollback;


  • 以上内容归redarmy_chen创建,如需转载请附带出处,如有疑问请发送邮件至redarmy_chen@qq.com

  

运维网声明 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-248984-1-1.html 上篇帖子: 浅谈PL/SQL Developer【Oracle相关】 下篇帖子: oracle hibernate 临时表 存储过程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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