Oracle事务的ACID特性
1、原子性(Atomicity)
事务的原子性是指事务中包含的所有操作要么都做,要么都不做,保证数据库是一致的。
例如:A帐户向B帐户划账1000,则先将A减少1000,再将B增加1000,这两个动作要么都提交,要么都回退,不可能发生一个有效、一个无效的情况。
2、一致性(Consistency)
一致性是指数据库在事务操作前和事务处理后,其中的数据必须都满足业务规则约束。
例如:A、B帐户的总金额在转账前和转帐后必须一致,其中的不一致必须是短暂的,在事务提交前才会出现的。
再如:约定B帐户不能多于1000元,则A转出1000成功,B转入1000失败,最终由原子性得到——整个事务回滚
3、隔离性(Isolation)
隔离性是数据库允许多个并发事务同时对齐数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
例如:在A、B之间转帐时,C同时向A转帐,若同时进行则A、B之间的一致性不能得到满足。所以在A、B事务执行过程中,其他事务不能访问(修改)当前相关的数值。
4、持久性(Durability)
持久性表示为:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
在提交之前如果系统故障,则所有信息全部丢失。提交之后数据存放在磁盘中,是永久性的。
事务的控制
事务的开始是隐形声明的,不用也没有语句可以进行操作,默认从对数据的修改开始就开始了当前事务。
对数据库的设置主要有一下语句:
SET TRANSACTION-----设置事务属性
SET CONSTRANS-------设置约束模式
SAVEPOINT-----------建立存储点
RELEASE SAVEPOINT---释放存储点
ROLLBACK------------回滚
COMMIT--------------提交
1、设置事务属性
设置事务属性主要可以用来完成以下工作:
* 指定事务的隔离层
* 规定回滚事务时所使用的存储空间
* 命名事务
注:SET TRANSACTION必须是事务的第一个语句。并在事务终止后自动失效。
SET TRANSACTION ISOLATION LEVEL READ COMMITED
A事务设置为READ COMMITED,该开始后B事务修改了数据,此时A无法得到新数据,B提交之后,A可以查询到更新数据。 A不可能错读,但可能发生假读和非重复读。
在需要并发数很大时应该使用READ COMMITED,对于多用户并发的性能和响应速度都比较好。
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
事务和事务之间完全隔离开,事务以串行的方式执行。不是说必须等一个结束,而是事务一旦开始,在结束之前查询到的数据永远是开始时刻的数据。由于留存的模式会比较多,所以会消耗一定的系统资源。
SET TRANSACTION READ ONLY
当前事务不能有任何修改数据的操作,READ ONLY是SERIALIZABLE的一个子集,基本上属于最高的安全级。
SET TRANSACTION READ WRITE
在READ的基础上增加WRITE权限,不常用
2、设置约束延期性
在操作过程中可能需要违反约束向表中插入重复的数据,其实需要设置约束延期性。
设置格式如下:
SET CONSTRAINT ALL | <constraint_name>
DEFERRED | IMMEDIATE
可以选择要延期的约束名,也可以使用ALL关键字延期所有的约束
DEFERRED表示延期,IMMEDIATE表示应用
注:理论上在COMMIT前需要设置回IMMEDIATE,但是系统可以隐式自动完成这一操作。
注意:要使用延迟的约束,必须在创建时就进行说明:
ALTER TABLE T1 ADD CONSTRAINT <constraint_name> DEFERRABLE INITIALLY IMMEDIATE
后面的DEFERRABLE 指名可以使用延迟,INITIALLY 设定了初始值
3、存储点
由于事务太大,一次回滚会对系统造成很大的压力。而且有时候在某一段特定的代码附近会特别发生错误而回滚。这时就需要在希望的地方设置一个存储点,可以显示得操作数据在发生错误时回滚到指定的存储点,而节省不必要的开销。
创建格式如下:
SAVEPOINT <savepoint_name>
使用格式如下:
ROLLBACK TO [SAVEPOINT] <savepoint_name>
4、结束事务
以下操作为将事务结束:
* 使用COMMIT提交事务,数据被永久保存
* 使用ROLLBACK回滚事务(不包括回滚到存储点)
* 执行DDL时,结束默认COMMIT
* 用户断开连接,此时事务自动COMMIT
* 进程意外中止,此时事务自动ROLLBACK