数据一致性和事务

Oracle中的数据一致性

当从A表取一条数据添加到B表时,需先删除A表数据,再新增B表数据,

如果第二条操作出异常时,就造成了数据不一致。

Oracle中的事务

事务是保证数据一致性的重要手段,试图改变数据库状态的多个动作应该视作一个密不可分的整体。无论其中经过了多么复杂的操作,该整体执行之前和执行之后,数据库均保证一致性。整个逻辑整体即是一个事务。

Oracle中的事务处理

事务的生命周期包括:事务开始、事务执行和事务结束。Oracle中,不会显式声明事务开始,而是由Oracle自行处理,事务结束可以利用commit或者rollback命令

利用commit命令界定事务

在一个会话中,一次事务的结束便意味着新事务的开始。事务的结束可以用commit命令

Update...;
Update...;
Update...;

利用多次Update命令,任意2个步骤间不存在commit和rollback命令,因此他们处于同一事务中。可以利用commit命令来提交修改

事务是指全部提交或者全部回滚,并不代表所有动作都可成功执行,如果某个动作失败,利用commit仍会提交所有成功的修改。

begin
	Update...;
	Update...;
	Update...;
	commit;
end

当使用begin end块时,一旦sql语句出现错误,那么不会对数据库做任何修改。

利用rollback命令界定事务

rollback回滚事务内的所有数据修改,并结束事务。

Update...;
Update...;
Update...;
rollback;

数据仍保持原状

Oracle事务的属性和隔离级别

Read only属性

利用Read only 设置只读事务
set transaction Read only ;

一旦设置事务为只读事务,则不能进行任何数据库修改操作、

只读事务除了自身不能修改数据库之外,还冻结了自身所认识到的数据库状态。也就是说,即使有其他事务修改了数据库状态,只读事务是无法识别的。

rollback回滚事务可以解除只读事务。

只读事务的特性,可以提供一种稳定的状态,从而处理大量的数据查询工作。例如,在生成统计报表时,需要查询大量数据。大数据量的查询耗时较多,又需要屏蔽外界干扰。在处理报表的过程中,可以利用只读事务提供稳定的环境,以使生成的报表更符合实际情况。

Read write 属性

Read write属性可以将事务设置为可读、可写状态。也是事务的默认状态。此状态下,事务可以查询、更新数据库内容。

serializable隔离级别

隔离级别是指当前事务对数据库状态变化的屏蔽程度。具有serializable隔离级别的事务是串行化事务。此事务与只读事务有完全相同的隔离级别,对外界其他事务对数据库的修改没有认知度。

设置隔离界别为serializable
set transaction isolation level serializable

与只读事务不同,串行化事务中是可以对数据库进行修改操作的。

Read commited隔离级别

Read commited隔离级别是事务的默认隔离级别。具有该隔离级别的事务只能识别其他事务已经提交的数据修改。

事务处理原则

原子性

原子性是事务的最基本属性。整个事务所有操作是一个逻辑整体。如同院子一样,不可分割,或者全部执行,或者都不执行。

一致性

事务结束后(无论提交还是回滚),数据库中数据的状态必须保持一致性、

隔离性

多个事务可能同时执行。在运行过程中,这些事务之间必须保持互相独立,不能相互影响。

脏读取

一个事务在执行时,有可能读取到外界其他事物对数据库的修改,这些修改是尚未提交,并可能被回滚。如果当前事务受到外界未提交数据的影响,将造成脏读取。

不可重读

同一事务中,前后2次读取表中同一记录,结果不同的。是因为有外界事务修改了该数据。这种修改是其他事务结束之后对数据的影响。

影像读取

同一事务中,前后2次执行相同的查询。第一次结果仍存在第二次结果中,并且没有任何改变。

在这里插入图片描述

持久性

持久性是指,事务一旦提交,对数据库的修改记录到永久介质中,例如存为磁盘文件,及时下一刻数据库故障,数据也不会丢失。

当用户提交事务时,Oracle总是先生成redo文件。此文件记录了事务对数据库修改的细节,即使系统崩溃,Oracle同样可以利用redo文件保证所有事务成功提交。

posted on 2018-10-17 16:50  NE_STOP  阅读(6)  评论(0编辑  收藏  举报  来源