总觉得事物四大特性好复杂,我刚刚学习Oracle

相关说明:
[IT教程网]oracle_11gR2_11 事务transaction - 四大特性(原子性,一致性,隔离性,永久性)和相应的例子来演示 视频教程.zip为特百度收集整理的结果,下载地址直接跳转到百度网盘进行下载,该文件的安全性和完整性需要您自行判断。感谢您对本站的支持.oracle事务特性
oracle事务特性
一个事务是指:由一系列数据库操作组成的一个完整的逻辑过程。例如银行转帐,从原账户扣除金额,以及向目标账户添加金额,这两个数据库操作的总和,构成一个完整的逻辑过程,不可拆分。这个过程被称为一个事务,具有ACID特性。
1:原子性(Atomicity,或称不可分割性)
2:一致性(Consistency)
3:隔离性(Isolation,又称独立性)
4:持久性(Durability)
原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的默认规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作
隔离性:当两个或者多个事务并发访问(此处访问指查询和修改的操作)数据库的同一数据时所表现出的相互关系。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
持久性:在事务完成以后,该事务对数据库所作的更改便持久地保存在数据库之中,并且是完全的。
如果几个事务要访问相同的数据项,为了保证
数据库的一致性,可以让这几个事务:
①串行执行:即一个接着一个地执行事务;
②并发执行:即同时执行多个事务,但用并发
控制机制来解决不同事务间的相互影响。
事务的提交与回滚:
提交( Commit )
通知事务管理器一个逻辑工作单元已完成,所做的更新操作可以被提交或永久保留
表明事务成功地结束
执行有效性检验
回滚( RollBack)
通知事务管理器事务未能正常完成,数据库可能处于不一致状态,当前事务所做的所有更新操作必须撤消
表明事务不成功地结束
目前主要有两种方式实现ACID:第一种是Write ahead logging,也就是日志式的方式。第二种是Shadow paging。
系统日志的恢复步骤是:
1、反向扫描文件日志(即从最后向前扫描日志文件),查找该事务
的更新操作。
2、对该事务的更新操作执行逆操作。即将日志记录&更新前的值&写
入数据库。这样,如果记录中是插入操作,则相当于做删除操
作;若记录中是删除操作,则做插入操作;若是修改操作,则相
当于用修改前的值代替修改后的值。
3、继续反向扫描日志文件,查找该事务的其他更新操作,并做和2
一样的同样处理。
4、如此处理下去,直至读到此事务的开始标记,事务的故障恢复就
并发的问题:
现有两处火车票售票点,同时读取某一趟列车车票数据库中车票余额为 X。两处售票点同时卖出一张车票,同时修改余额为 X -1写回数据库,这样就造成了实际卖出两张火车票而数据库中的却记录只少了一张。
产生这种情况的原因是因为两个事物读入同一数据并同时修改,其中一个事物提交的结果破坏了另一个事物提交的结果,导致其数据的修改被丢失,破坏了事物的隔离性。并发控制要解决的就是这类问题。
先查一下锁的概念:
封锁是一项用于多用户同时访问数据库的技术,是实现并发控制的一项重要手段,能够防止当多用户改写数据库时造成数据丢失和损坏。当有一个用户对数据库内的数据进行操作时,在读取数据前先锁住数据,这样其他用户就无法访问和修改该数据,直到这一数据修改并写回数据库解除封锁为止。
解决方法:
悲观并发控制(又名&悲观锁&,Pessimistic Concurrency Control,缩写&PCC&)是一种并发控制的方法。它可以阻止一个事务以影响其他用户的方式来修改数据。如果一个事务执行的操作都某行数据应用了锁,那只有当这个事务把锁释放,其他事务才能够执行与该锁冲突的操作。
悲观并发控制主要用于数据争用激烈的环境,以及发生并发冲突时使用锁保护数据的成本要低于回滚事务的成本的环境中。
观并发控制实际上是&先取锁再访问&的保守策略,为数据处理的安全提供了保证。但是在效率方面,处理加锁的机制会让数据库产生额外的开销,还有增加产生死锁的机会;另外,在只读型事务处理中由于不会产生冲突,也没必要使用锁,这样做只能增加系统负载;还有会降低了并行性,一个事务如果锁定了某行数据,其他事务就必须等待该事务处理完才可以处理那行数据。
乐观并发控制(又名&乐观锁&,Optimistic Concurrency Control,缩写&OCC&)是一种并发控制的方法。它假设多用户并发的事务在处理时不会彼此互相影响,各事务能够在不产生锁的情况下处理各自影响的那部分数据。在提交数据更新之前,每个事务会先检查在该事务读取数据后,有没有其他事务又修改了该数据。如果其他事务有更新的话,正在提交的事务会进行回滚。
乐观并发控制多数用于数据争用不大、冲突较少的环境中,这种环境中,偶尔回滚事务的成本会低于读取数据时锁定数据的成本,因此可以获得比其他并发控制方法更高的吞吐量。
乐观并发控制的事务包括以下阶段:
读取:事务将数据读入缓存,这时系统会给事务分派一个时间戳。
校验:事务执行完毕后,进行提交。这时同步校验所有事务,如果事务所读取的数据在读取之后又被其他事务修改,则产生冲突,事务被中断回滚。
写入:通过校验阶段后,将更新的数据写入数据库。
优点与不足:
乐观并发控制相信事物之间的数据竞争(data race)的概率是比较小的,因此尽可能直接做下去,直到提交的时候才去锁定,所以不会产生任何锁和死锁。但如果直接简单这么做,还是有可能会遇到不可预期的结果,例如两个事务都读取了数据库的某一行,经过修改以后写回数据库,这时就遇到了问题
熟悉一下时间戳的概念以及时间戳的精度:
时间戳(英语:Timestamp)是指在一连串的资料中加入辨识文字,如时间或日期,用以保障本地端(local)资料更新顺序与远端(remote)一致。
时间戳的范例如下:
T 10:45 UTC
T 11:20 UTC&
Sat Jul 23 02:16:57 2005
UTC世界协调时:采用国际原子时进行计算:
国际原子时的误差为每日数纳秒
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
]   所谓出于job而胜于job,说的就是Oracle 10g后的新特性Scheduler啦。在10g环境中,ORACLE建议使用Scheduler替换普通的job,来管理任务的执行。其实,将Scheduler描述成管理job的工具已经太过片面了,10G版本中新增的Scheduler绝不仅仅是创建任务这么简单。。。。&&&[
]   本小节介绍如何启用、禁用创建的jobs,以及如何修改jobs的众多属性,如何手动执行jobs等内容。&&&[
]   在论坛中偶尔见过有人讨论如何在ORACLE中执行操作系统命令,或是ORACLE数据库外的应用。应该说在9i及之前的版本中,虽然说并非完全无法实现(其实还是有多种方式能够变相实现的),不过复杂的实现方式让DBA使劲了力,伤透了心,费劲了事儿。
进入10g版本之后,就完全不必如此费神,因为有了DBMS_SCHEDULER,因为有了PROGRAM。&&&[
]   10g中新推出的SCHEDULER可能确实会让很多初接触的朋友感觉晕头晕脑,相比之前的jobs,SCHEDULER中新增的概念太多。比如说jobs,仍然可以理解成之前版本中的jobs,不过功能更加强大(注意10g中也仍然可以使用普通jobs,这是废话,相信看本篇文章的朋友目前应该还是这样在用),比如说program,指的是运行的程序(把要做什么单提出来了),比如说schedule,我将其翻译为调度(job我翻译为任务),定义执行的频率或者说周期。&&&[
]   通过schedule调度program的执行的job,看到这样的形容是不是让你彻底晕头了,就说明你还是没搞明白10g中SCHEDULERS特性管理的jobs的含意,让三思更直白地给你描述描述。10g版本中SCHEDULER将JOB分成了多个部分,program负责做什么,schedule负责啥时候做,job就简单了,一个字:做。&&&[
]   Job和Schedule中REPEAT_INTERVAL参数都是用来控制执行的频率或周期,虽然说周期是一个时间性概念,不过REPEAT_INTERVAL指定的时候并不是一个时间值,而是由一组关键字描述的时间。&&&[
]   Event直译对应的中文解释是指事件,不过单纯讲事件毕竟太抽象了,举个示例来形容吧。A(对应某个应用程序,或者是ORACLE中的进程)在干活时突然眉头一皱说道,不好,前方有情况,这可怎么办!这时,只见它认真想了想,过了一会儿脸上一喜说道:有了,俗话说早请示啊晚汇报,出现情况要找领导,赶紧给领导发消息呗!于是B(也是对应某个应用或ORACLE进程)就收到了一条A发过来的"前方有XX情况"的消息,这个过程就叫EVENT(含A发消息以及B接收消息)。&&&[
]   首先要说明,这里所说的Application是个代词,即可以表示ORACLE数据库之外的应用程序,也可以是ORACLE数据库中的PROCEDURE等对象,总之你就将其理解成用户自己创建的对象就好了。&&&[
]   今天要来认识一位新同学:CHAIN(注意不要敲成CHINA)。CHAIN可以被视做一组Programs的复合,举个简单的例子:运行PROGRAM:A以及PROGRAM:B,如果成功的话继续运行PROGRAM:C,否则的话运行PROGRAM:D。Programs:A、B、C、D以及执行的逻辑关系就构成了一个最简单的CHAIN。&&&[
]   基本上碰到修改CHAIN属性的机率不会太大,因此确实没啥可修改的,对于CHAIN对象来说,能够修改的属性只有两个:evaluation_interval和comments。&&&[
]   Job Classes相当于创建了一个job组,DBA可以将那些具有相同特性的job,统统放到相同的Job Classes中,然后通过对Job Class应用ORACLE中的"资源使用计划"特性,就可以对这些job执行过程中所需要的资源分配情况进行管理。&&&[
]   此Windows非彼Windows,通常说的Windows是指盖首富的操作系统,而此处所说的Windows,是指SCHEDULER特性中的一个子项。在SCHEDULER中,WINDOW对应的是一个时间窗口的概念。
本站文章均为原创,转载请注明出处
站点设计: 我们的口号:前进就是在发展37220人阅读
PL/SQL编程(25)
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:562649次
积分:6077
积分:6077
排名:第2847名
原创:128篇
转载:65篇
评论:65条
(4)(1)(1)(1)(1)(3)(5)(1)(8)(3)(9)(2)(12)(11)(2)(3)(1)(16)(3)(1)(2)(4)(2)(9)(4)(5)(16)(4)(2)(1)(1)(2)(1)(4)(2)(18)(12)(16)

我要回帖

 

随机推荐