在事务中有四个通用的原则是所有数据库都必须遵守的,简称ACID原则,下面简单概述一下oracle是怎样实现这四个原则的。
一. 原子性(Atomicity):一个事务要么全部执行,要么全部都不执行
在oracle中,当我们做一次变更的时候,系统会自动创建一条undo记录来描述怎样撤销这次变更。也就是说,当执行到一个事务的中间时,如果有其他用户想访问我们更改过的数据,他必须使用undo记录来查看变更前的旧数据,即只有当我们提交这个事务后,所做的更改才能被他人看到。这样就可以确保,其他用户要么能看到我们所做的更改,要么什么更改都看不到。另外一种情况,如果我们这个事务失败,我们也可以根据undo里面的信息将我们所做的修改回退。保证要么全部成功,要么全部失败。
二. 一致性(Consistency):一个事务的运行并不改变数据库中数据的一致性
假设一个事务需要进行3种更新操作,某一时刻执行成功了2种更新操作。这个时候数据库中的数据不是一致性的状态,因为还有第三种更新操作没有执行。假如这个时候,别人看到了我们执行成功的2种更新操作后的结果,那就破坏了数据的一致性。oracle中由于undo的存在,其他用户无法看到事务的增量应用(也就是执行成功的2种更新操作),也就是无法看到这个不合法的临时状态。他们要么看到老状态,要么看到新状态,没有中间态。
三. 独立性(Isolation): 一个事务不能看到另一个没有提交的事务的执行结果
从第一点就可以看出,oracle通过undo能保证其他用户看不到我们事务所做的修改,在我们提交之前。其他事务只能从undo里面去寻找以前旧版本的数据,而非我们事务改变了的新数据。
四. 持久性(Durability): 一旦事务成功,数据的修改是永久的
该原则突出了oracle重做日志的优势。在oracle中,事务一旦提交,oracle就会将重做日志顺序地写入到重做日志文件。而不是去磁盘持久化我们这个事务所做的修改。比如,一个事务修改了100条数据,假设这100条数据是随机在磁盘的不同地方,那一旦事务提交,我们就得花费大量时间去磁盘寻找我们需要修改的数据,并将其修改。oracle没有这样做。oracle只是自己生成一系列重做日志(描述数据的修改),然后顺序写入磁盘的重做日志文件,写入成功即代表着这个事务提交成功,即使修改还没有真正持久化到磁盘。假设这个时候突然断电,磁盘的数据还没有修改为正确的数据,但是事务已经成功了,怎么办呢。oracle在下次启动的时候会自动读取重做日志文件,将没有持久化到磁盘的修改,再做一遍,将修改持久化到数据库,从而保证提交的事务,数据的修改是永远的。