概念:在数据中事务是工作的逻辑单元,一个事务是有一个获多个完成一组的相关行为的Sql语句组成。通过事务机制确保这一组sql语句所作的操作要么完全执行成功,要么一点也不执行。
主要特征:确保数据库的完整性
事务的ACID特性:
A是事务的原子性:事务中包含的所有操作要么全做,要么全不做,也就是说所有的活动在数据中要么全反映要不全都不反映。
C是事务的一致性:数据库在事务操作前和事务处理后,其中数据必须满足业务的规则约束。
I是事务的隔离性:数据库允许多个并发的事物同时对其中的数据进行读写或修改的能力,隔离性可以防止多个事物的并发执行时,由与它们的操作命令交叉执行而导致数据的不一致性
D是事务的持久性:事务处理结束后,它对修改应该是永久的。即使是系统在遇到故障的情况下也不会丢失,这是数据的重要性决定的。
数据异常:
隔离性定义了一个事物与其它事物的隔离程度,为了更好的理解隔离层。首先讨论一下并发事务对同一个数据库进行访问可能发生的情况,在并发事务中总体来说会发生3中情况:
错读(脏读),非重复读取(不可重复读),假读(幻读)
脏读:当一个事物修改数据库时,另一个事务读取了该数据,但第一事务由于某种原因取
消对数据修改,使数据返回了原来的状态,这时第二个事物读取的数据与数据库中数据不一致,这就是脏读。
非重复读:一个事务读取数据库中的数据后,另一个事务则更新了数据,当第一个事务再次读取其中的数据时,就会发现数据已经发生了改变,这就是非重复读取。非重复读取所导致的结果就是一个事务前后两次读取的数据不相同。
假读:如果一个事务基于某个条件读取数据后,另一个事务则更新了同一个表中的数据,这时第一个事务再次读取数据时,根据搜索的条件返回了不同的行,这就是假读
事务中遇到的这些异常与事务的隔离性设置有关,事务的隔离性设置越多,异常就出现的越少,但并发效果就越低,事务的隔离性设置越少,异常出现的越多,并发效果越高。
选择隔离层
针对3中读取的数据时产生的不一致现象,在ANSISQL标准92中定义了4个事务的隔离级别.如下图所示:
隔离层 错读|脏读 非重复读取|不可重复读 假读|幻读
READ UNCOMMITTED(非提交读) 是 是 是
READ COMMITTED(提交读) 否 是 是
Repeatable READ(可重复读) 否 否 是
Serializable(串行读) 否 否 否
Oracle支持上述四种隔离层中的两种:readcommitted 和serializable。除此之外oralce中还定义read only 和 read write隔离层。
Readcommitted 这是oracle默认的隔离层。
Serializable:设置事物的隔离层位它时,事务与事务之间完全隔开,事务以串行的方式执行,这并不是说一个事务必须结束才能启动另外一个事务,而是说这些事务的执行的结果于一次执行的事务的结果一致。
Read only和 read write当使用read only时,事务中不能有任何修改数据库中数据的操作语句,这包括 insert、update、delete、create语句。Read only是serializable的一个子集,区别是read only 只读,而serialzable可以执行DML操作。Read write它是默认设置,该选项表示在事务中可以有访问语句、修改语句.但不经常使用.
执行语句:
Commit 提交语句;
Rollback 回滚事务;
SAVEPOINT语句在当前事务中创建保存点:
ROLLBACK TO SAVEPOINT 回滚到保存点。