Oracle事务

来源:互联网 发布:软件兼容性是什么意思 编辑:程序博客网 时间:2024/05/17 01:59

一、事务定义:

事务是有一系列操作序列构成的程序执行单元,这些操作要么都做,要么都不做,是一个不可分割的工作单元。例如:

银行转帐:事务TA帐号转帐50元到B帐号。(其中Read(X):从数据库传送数据项X到事务的工作区,Write(X):从事务的工作区中将数据项X写入到数据库)

Read(A)

A=A-50;

Write(A);

Read(B);

B=B+50;

Write(B);

二、SQL中事务的定义:

事务以Begin transaction开始,以Commit transactionRollback transaction结束。

Commit transaction表示提交,事务正常结束。

Rollback transaction表示事务非正常结束,撤销事务已做的操作,回滚到事务开始时状态。

CommitWork(Rollback work)后不跟事务名称。

三、事务特性(ACID)

原子性:事务中包含的所有操作要么都做,要么都不做,原子性由数据库中的恢复机制实现的。

一致性:事务的隔离执行必须保证数据库的一致性,事务开始前,数据库处于一致性的状态,,事务结束后,数据库必须仍然处于一致性的状态。数据库的一致性状态由用户来负责的,也是由数据库的恢复机制并发控制机制实现的。

隔离性:系统必须保证事务不受其他并发执行事务的影响。隔离性通过并发控制机制实现的。

永久性:一个事务一旦提交后,它对数据库的影响必须是永久的。系统发生故障不能改变事务的持久性。持久性通过恢复机制实现的。

四、事务生命周期图

五、事务执行模式:

显示事务:以Begin Transaction开始,以CommitRollback结束。

隐含事务:事务自动开始,知道遇到Commit或者Rollback对结束。语法:SET IMPLICIT_TRANSACTIONS ON

自动事务:每个事务操作语句作为一个事务。Update Table Set Score=Score+101

六、事务模型:

平面事务:一层结构Begin Transaction Commit,缺点是不能部分回滚。

嵌套事务:内部事务的提交并不释放资源或使其修改成永久修改,只有在提交了外部事务,数据的修改才具有永久性,而且资源才会释放。

保存点:批量工作可以设置一个保存点,一旦碰到意外的情况,可以回滚到最近的保存点,下次启动就可以在这个保存点接着往下执行,可以最大限制保存已经完成的工作。

分布式事务:牵涉到网络上不同的计算机节点的数据操作。

七、事务调度:

事务的执行顺序成为一个调度,表示事务的指令在系统中执行的时间顺序。

一组事务的调度必须保证:1.包含了所有事务的操作指令2.一个事务中指令的顺序必须保持不变。

并行VS串行

基本比较:并行事务可能会破坏数据库的一致性,串行事务效率低。

并行的优点:一个事务由不同的步骤组成,所涉及的系统资源也不同,这些步骤可以并行执行,以提高系统的吞吐量。(目前的数据库都是采用并行的调度)

八、事务隔离性级别:

当用户对数据库并发访问时,为了确保事务的完整性和数据库的一致性,需要使用锁定,这是实现数据库并发控制的主要手段,锁定可以防止用户读取正在由其他用户更改的数据,并可以防止多个用户同时更改相同数据。如果不使用锁定,则数据库中的数据可能在逻辑上不正确,并且对数据库的查询可能会产生意想不到的结果,具体的来说,锁可以防止一下情况:

丢失修改:两个事务T1T2读入同一数据并修改,T1提交的结果破坏了T2提交的结果,导致T1的修改丢失。

脏读:事务T1修改某一个数据,并将其写回,事务T2读取同一数据后,T2由于某种原因被撤销,这是T1已经修改的数据恢复原值,T2读到的数据与数据库中的数据不一致,则T2读到的数据就是脏数据。

不可重复读:事务T2读取某一个数据后,事务T1对其做了修改,当T2再次读取该数据时候,得到的与前次不同的值。

幻想读:事务T2按一定条件读取了某些数据后,事务T1插入了一些满足这些条件的数据,当T2再次按相同条件读取数据时候,发现多了一些记录。

SQL中隔离性级别的定义:

Serializable:一个调度的执行必须等价于一个串行调度的结果。

Repeatable read:只允许读取已提交的记录,并要求一个事务对同一记录的两次读取之间,其他的事务不能对该记录进行更新。

Read committed:只允许读取已经提交的记录,但不要求重复读。

Read uncommitted:允许读取未提交的记录。

级别从高到低,发生数据不一致的几率低,但是封锁的强度越大,导致系统并发度越小。

不同的隔离性的级别下发生不一致的现象:

隔离性级别

不一致的现象

Read uncommitted

读脏数据,不能重复读,幻想读

Read committed

不能重复读,幻想读

Repeatable read:

幻想读

Serializable

 

实际的数据库中都是通过封锁机制来实现的:

Read uncommitted:不发出任何锁。

Read committed:发出一个共享锁

Repeatable read:两次读取之间锁是一致保持的。

Serializable:不但对现有数据的锁封锁,而且是根据事务的查询条件封锁。