数据一致性和事务
Oracle中的数据一致性
当从A表取一条数据添加到B表时,需先删除A表数据,再新增B表数据,
如果第二条操作出异常时,就造成了数据不一致。
Oracle中的事务
事务是保证数据一致性的重要手段,试图改变数据库状态的多个动作应该视作一个密不可分的整体。无论其中经过了多么复杂的操作,该整体执行之前和执行之后,数据库均保证一致性。整个逻辑整体即是一个事务。
Oracle中的事务处理
事务的生命周期包括:事务开始、事务执行和事务结束。Oracle中,不会显式声明事务开始,而是由Oracle自行处理,事务结束可以利用commit或者rollback命令
利用commit命令界定事务
在一个会话中,一次事务的结束便意味着新事务的开始。事务的结束可以用commit命令
Update...;
Update...;
Update...;
利用多次Update命令,任意2个步骤间不存在commit和rollback命令,因此他们处于同一事务中。可以利用commit命令来提交修改
事务是指全部提交或者全部回滚,并不代表所有动作都可成功执行,如果某个动作失败,利用commit仍会提交所有成功的修改。
begin
Update...;
Update...;
Update...;
commit;
end
当使用begin end块时,一旦sql语句出现错误,那么不会对数据库做任何修改。
利用rollback命令界定事务
rollback回滚事务内的所有数据修改,并结束事务。
Update...;
Update...;
Update...;
rollback;
数据仍保持原状
Oracle事务的属性和隔离级别
Read only属性
利用Read only 设置只读事务
set transaction Read only ;
一旦设置事务为只读事务,则不能进行任何数据库修改操作、
只读事务除了自身不能修改数据库之外,还冻结了自身所认识到的数据库状态。也就是说,即使有其他事务修改了数据库状态,只读事务是无法识别的。
rollback回滚事务可以解除只读事务。
只读事务的特性,可以提供一种稳定的状态,从而处理大量的数据查询工作。例如,在生成统计报表时,需要查询大量数据。大数据量的查询耗时较多,又需要屏蔽外界干扰。在处理报表的过程中,可以利用只读事务提供稳定的环境,以使生成的报表更符合实际情况。
Read write 属性
Read write属性可以将事务设置为可读、可写状态。也是事务的默认状态。此状态下,事务可以查询、更新数据库内容。
serializable隔离级别
隔离级别是指当前事务对数据库状态变化的屏蔽程度。具有serializable隔离级别的事务是串行化事务。此事务与只读事务有完全相同的隔离级别,对外界其他事务对数据库的修改没有认知度。
设置隔离界别为serializable
set transaction isolation level serializable
与只读事务不同,串行化事务中是可以对数据库进行修改操作的。
Read commited隔离级别
Read commited隔离级别是事务的默认隔离级别。具有该隔离级别的事务只能识别其他事务已经提交的数据修改。
事务处理原则
原子性
原子性是事务的最基本属性。整个事务所有操作是一个逻辑整体。如同院子一样,不可分割,或者全部执行,或者都不执行。
一致性
事务结束后(无论提交还是回滚),数据库中数据的状态必须保持一致性、
隔离性
多个事务可能同时执行。在运行过程中,这些事务之间必须保持互相独立,不能相互影响。
脏读取
一个事务在执行时,有可能读取到外界其他事物对数据库的修改,这些修改是尚未提交,并可能被回滚。如果当前事务受到外界未提交数据的影响,将造成脏读取。
不可重读
同一事务中,前后2次读取表中同一记录,结果不同的。是因为有外界事务修改了该数据。这种修改是其他事务结束之后对数据的影响。
影像读取
同一事务中,前后2次执行相同的查询。第一次结果仍存在第二次结果中,并且没有任何改变。
持久性
持久性是指,事务一旦提交,对数据库的修改记录到永久介质中,例如存为磁盘文件,及时下一刻数据库故障,数据也不会丢失。
当用户提交事务时,Oracle总是先生成redo文件。此文件记录了事务对数据库修改的细节,即使系统崩溃,Oracle同样可以利用redo文件保证所有事务成功提交。