oracle 事务概念

原文地址:http://blog.sina.com.cn/s/blog_6c83e32d0100y5fd.html

声明:转载只为记录学习使用,如有侵权,请留言删除

1.事务概念

事务可以看作是由对数据库的若干操作组成的一个单元,这些操作要么都完成,要么都取消,从而保证数据满足一致性的要求。事务的一个典型例子是银行中的转账操作,账户A把一定数量的款项转到账户B上,这个操作包括两个步骤,一个是从账户A上把存款减去一定数量,二是在账户B上把存款加上相同的数量。这两个步骤显然要么都完成,要么取消,否则银行会有损失。显然,这个转账操作中的两个步骤构成了一个事务。

事务有几个特性:原子性、一致性、隔离性、持久性

原子性:事务中的操作,要么全部完成,要么全部取消。

一致性:事务中的操作保证数据库中的数据不会出现逻辑上不一致的情况,一致性一般会隐含的包括在其他属性之中。

隔离性:当前的事务与其他未完成的事务是隔离的。在不同的隔离级别下,事务的读取操作,可以得到的结果是不同的。

持久性:对事务发出的commit命令后,即使这是发生系统故障,事务的效果也被持久化了。与此相反的是,当在事务执行过程中,系统发生故障,则事务的操作都被回滚,即数据库回到事务开始之前的状态。

对数据库中的数据修改都是在内存中完成的,这些修改的结果可能已经写到硬盘也可能没有,如果在操作过程中,发生断电或者系统错误等故障,数据库可以保证为结束的事务对数据库的数据修改结果技术已经写入磁盘在下次数据库启动后也会全部被撤销;而对于结束的事务,即使其修改的结果还未写入磁盘,在数据库下次启动后会通过事务日志中的记录进行“重做”,即使把丢失的数据修改结果重新生成,并写入磁盘,从而保证结束事务对数据修改的永久化。这样也保证了事务中的操作要么全部完成,要么全部撤销。

2.事务隔离级别

在oracle中,只有Read Commited 和 Serializable级别,其含义与Sql Server类似,但实现方式却不一样。

在oracle中,存在所谓的回滚段(oracle 9i之前版本)或撤销段(oracle 9i版本),oracle 在修改数据记录时,会把这些记录被修改之前的结果存在回滚段或撤销段中,就是因为这种机制,oracle对于事务隔离级别的实现与sql server 截然不同。在oracle中,读取操作不会阻碍更新操作,更新操作也不会阻碍读取操作,这样在oracle中的各种隔离级别下,读取操作都不会等到更新事务结束,更新操作也不会因为另一个事务中的读取操作而发生等待,这也是oracle事务处理的一个优势所在。

oracle缺省的设置是Read Committed隔离级别(也称为语句级别的隔离),在这种隔离级别下,如果一个事物正在对某个表进行DML操作,而这时另外一个会话对这个表的记录进行读取操作,则oracle会去读取回滚段或者撤销段中存放的更新之前的记录,而不会像sql server 一样等待更新事务的结束。

在serializable隔离级别(事务级别的隔离),事务中的读取操作只能读取这个事务开始之前已经提交的数据结果。如果在读取时,其他事务正在对记录进行修改,则oracle就会在回滚段或者撤销段中寻找对应的原来未经更改的记录(而且是在读取操作所在的事务开始之前存放在回滚段或者撤销段的记录),这时读取操作也不会因为相应记录被更新而等待。

猜你喜欢

转载自blog.csdn.net/m0_37298602/article/details/77324648
今日推荐