Oracle事务处理

Oracle事务处理 

        事务是由一系列语句构成的逻辑工作单元。事务和存储过程等批处理有一定程序上的相似之处,通常都是为了完成一定业务逻辑而将一条或多条语句“封装”起来,使它们与其他语句之间出现一个逻辑上的边界,并形成相对独立的一个工作单元。


        当使用事务修改多个数据表时,如果在处理的过程中出现了某种错误,例如系统死机或突然断电等情况,则返回结果是全部数据均没有被保存。因为事务的处理结果只有两种:一种是在事务处理的过程中,如果发生了某种错误则整个事务全部回滚,使所有对数据的修改全部撤消,事务对数据库的操作是单步执行的,当遇到错误时可随时地回滚;另一种是如果没有发生任何错误且每一步的执行都成功,则整个事务全部被提交。从而可以看出,有效地使用事务不但可以提高数据的安全性,而且还可以增强数据的处理效率。事务包含4种重要的属性,被统称为ACID(原子性、一致性、隔离性和持久性),一个事务必须通过ACID。


     原子性(Atomic):事务是一个整体的工作单元,事务对数据库的操作要么全部执行,要么全部撤消。如果某条数据执行失败,则所有数据全部回滚。


     一致性(ConDemoltent):事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保证所有数据的完整性。如果事务成功,则所有数据将变为一个新的状态;如果事务失败,则所有数据将处于开始之前的状态。


     隔离性(Isolated):由事务所作的修改必须与其他事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。


     持久性(Durability):当事务提交后,对数据库所做的修改就会永久保存下来。


        Oracle 11g的事务是隐式的自动开始的,它不需要用户显示地执行开始事务语句。但对于事务的结束处理,则需要用户进行指定的操作,通常以下情况时,Oracle认为一个事务结束了。
    1.执行COMMIT语句提交事务。
    2.执行ROLLBACK语句撤消事务。
    3.执行一条数据定义语句,比如CREAT、DROP或ALTER等语句。如果该语句执行成功,那么Oracle系统会自动执行COMMIT命令;否则,Oracle系统会自动执行ROLLBACK命令。
    4.执行一个数据控制命令,比如GRANT、REVOKE等控制命令,这种操作执行完毕,Oracle系统会自动执行COMMIT命令。
    5.正常地断开数据库的接连、正常地退出SQL*Plue环境,Oracle系统会自动执行COMMIT命令;否则,Oracle系统会自动执行ROLLBACK命令。

1. 提交事务(COMMIT语句)

        提交事务是指把对数据库进行的全部操作持久性地保存到数据库中,这种操作通常使用COMMIT语句来完成。在使用该语句提交事务时,Oracle系统内部会按照如下顺序进行处理。

        1.在回滚段内记录当前事务已提交,并且声称一个唯一的系统编号(SCN),以唯一的标识这个事务。
    2.启动后台的日志写入进程(LGWR),将SGA区的重做日志缓冲区中的数据和当前事务的SCN写入重做日志文件中。
    3.Oracle服务器开始释放事务处理所使用的系统资源。
    4.显示通知,告诉用户事务已经成功提交。

        在HR模式下,向新建表jobs_temp中添加一条记录,然后使用COMMIT语句提交事务,使新增记录持久化到数据库中:

SQL>insert into jobs_temp values(‘DESIGN’, ‘设计人员’, 3000,5000);
SQL>已创建1行
SQL>commit;
SQL>提交完成


        在上面的实例中,如果用户不使用COMMIT提交事务,此时,再开启一个SQL*Plus环境(但要求当前的SQL*Plus环境不退出,若退出,Oracle系统会自动执行COMMIT语句提交数据库),然后在HR模式下查询jobs_temp表,会发现新增加的记录不存在。若用户使用COMMIT语句提交事务,则在另一个SQL*Plus环境下就能够查询到新增加的记录。

2. 回滚事务(ROLLBACK语句)

        回滚事务是指撤消对数据库进行的全部操作,Oracle利用回滚段来存储修改前的数据,通过重做日志来记录对数据所做的修改。如果要回滚整个事务,Oracle系统内部将会执行如下操作过程:
    1.使用回滚段中的数据撤消对数据库所做的修改。
    2.Oracle后台服务进程释放掉事务所使用的系统资源。
    3.显示通知,告诉用户事务回滚成功。


        Oracle不仅允许回滚整个未提交的事务,还允许回滚事务的一部分,这可以通过“保存点”来完成。在事务的执行过程中,用户可能通过建立保存点将一个较长的失误分隔为几部分。这样用户就可以有选择地回滚到某个保存点,并且该保存点之后的操作都将被取消。


        在HR模式下,向新建表jobs_temp中先后添加两条记录,然后使用保存点(savepoint)来回滚最后添加的那条记录:


 

猜你喜欢

转载自elviszhao.iteye.com/blog/2278607