在看本文之前,请确保你已经了解了Oracle事务和锁的概念即其作用,不过不了解,请参考数据库事务的一致性和原子性浅析和Oracle TM锁和TX锁
1、提交事务
当执行使用commit语句可以提交事务.当执行了commit语句后,会确认事务的变化、结束事务、删除保存点、释放锁。在此之前,与当前事务相关的数据都会被加锁,直到当前事务进行了commit操作,如果在这个过程中有其他回话试图操作相关数据,(这些数据已经被当前事务加锁),那么其他回话会进行等待,或者直接返回错误。
注意:只有在提交事务之后也就是进行commit操作之后,数据才会真正的发生改变,在commit提交之前操作,全部被记录入Oracle日志系统
2、回退事务
在说回退事务之前,先说Oracle事务的保存点(savepoint)的概念和作用,保存点是事务中的一点,用于取消部分事务,保存点记录的是当前数据库的状态
在事务commit提交前,可以使用rollback 到指定的保存点,来回退到指定的保存点
在事务commit提交后,保存点会被删除,这个时候,就无法进行回退了
这里在使用保存点之前,强调一点,任何commit操作,也就是事务提交操作,都会导致savepoint的被删除!!!
3、rollback to savepoint 取消部分事务
select * from test; savepoint a; ---创建回退点
接着删除一条数据
delete from test where deptno=10
select * from test;
ok,depetno为10的那行数据被删了,现在使用rollback+savepoint进行回退
rollback to a; select * from test;
数据又回来了,我在删除数据之前,添加了一个会退点,然后进行删除数据,接着发现那条数据不能删,我就通过保存点返回到删除数据之前的那个保存点所对应的数据库状态
4、rollback 取消全部事务
回退的机制和rollback to savepoint 一样,但是使用rollback就是取消当前事务的全部操作,也就说当前事务先前的操作会全部被取消
5、只读事务
只读事务是指只允许执行查询的操作,而不允许执行其他任何的DML操作,只读事务可以帮助获取某个时间点的数据。
例:假定机票代售点每天18点统计今天的销售情况,这时可以使用只读事务,在设置了只读事务之后,尽管其他回话会提交新的事务,但是只读事务不会获取新的数据变化,从而保证取得特定时间点的数据信息。
口令:
set transaction read only
使用scott登录的会话,设置只读事务
ok,只读事务设置完毕
现在我们用dba身份登录sqlplus,创建一个会话,然后向scoot.dept表中插入一条新数据
ok,插入成功!
现在看看scott回话中,能不能插到dept中新添加的记录;
scott会话,并没有查到,新添加的记录。
但是sysdba的回话中,数据已经添加了
ok,根据上面的代码演示,我们可以得出,当一个事务被设置为只读事务,那么当前事务只能查询到这个时间点的数据记录,就算有其他会话对数据记录进行修改,也不会影响到只读事务。