Oracle事务的几个特性讲解
第一:原子性(atomicity)
事务是的逻辑工作单位,这个单位里包含了一组操作,那么这个单位要么执行成功,要么失败;数据库为了实现这个效果,通俗的说:数据库将所有的操作都写入了“日志”(所谓的日志不是指通常的日志,具体的形式比如缓存还是文件之类的,我们在后面讲)暂时保存,如果中间有某个操作失败了,这时候数据库就可以根据“日志”回溯,把事务内执行成功的操作撤销,这就是所谓的“回滚”(rollback),从而达使这个事务内所有的dml操作失败,也就是整体失败;如果说事务内的所有操作都成功了,可以通过commit,将事务内的dml更改(增,删、改)的数据保存至数据库中(专业点的话叫作:持久化),一旦数据被持久化,是不可能再被回滚!!
第二:一致性(consistemcy)
如果仔细的分析,曾经我对于原子性和一致性两者有些混淆,认为两者都是保证了数据库的事务的完整性,其实这样的说法是不太准确的,为了形象的表达一下观点,我举个例子:
如果把事务比作是一扇门,a,b,c作为一个整体穿过这扇门,成功的穿过之后,就变成了 a,b,c;那么我们来看,事务执行完毕前,abc三者保持了一致性,事务执行完毕之后,abc三者保持了一致性。对于数据库事务来说,不可能出现abc或者abc等不一致的情况;
那么我们可以认为:原子性是事务一致性的保证!!
ps: 这时候有人会说,我一个方法里有abc操作,c操作的时候报错了,也没回滚,a和b操作成功了;
原因:程序没开事务,或者不在一个事务里(高端点的例子:spring嵌套事务,或者oracle的自治事务,不要急后面会讲到)
第三:持久性(durability)
简单来说,事务提交后,数据会真正保存到数据库(生米煮成熟饭了),就不能回滚了(熟了还能再弄成生米??)
第四:隔离性(isolation)
这个特性我先举个例子:有个浴室(外面无法偷看),假设每次只能进去一个人,在这个人出来之前,另外一个人不能进去,那么已经进去的这个人根本就不用担心被别人看光,因为浴室里就他一个人。但是外边的其他人就会等不及,显然浴室不够用;那么我们是不是把浴室隔成隔断间,那是不是很多人能一起进入浴室,使用不同的隔断间洗澡了~(当然,一个隔断间还是只允许一个人进去)
我们回到数据库事务,数据库就想到了一个办法,对于并发执行的事务隔离开,相互之前不影响执行!如果有两个相同的事务,在相同的时间内,执行相同的功能,这时候事务的隔离性起作用了,它会确保每一个事务在中认为只有自己在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。通过设置数据库的隔离级别,可以达到不同的隔离效果(后面的篇章中会讲到spring事务的隔离级别和传播机制)。