暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

oracle 事务中的 commit rollback

原创 不吃草的牛_Nick 2023-06-11
997

COMMIT语句成功地结束一个事务,自事务开始以来由所有SQL语句做的更改都将永久记录在数据库中。在发出COMMIT语句前,其他事务看不见所做的这些更改。
可以使用下面的语句之一提交一个事务,这将使更改永久化:
COMMIT;
COMMIT WORK;

在Oracle发出一条COMMIT语句前,数据库中发生下列事情。
★ Oracle在SGA的撤销段缓冲区中生成撤销记录。正如所知,撤销记录包含更新和删除表行的旧值。
★ Oracle在SGA的重做日志缓冲区中生成重做日志项。
★ Oracle修改SGA的数据库缓冲区。

注解 在发出COMMIT语句前,被修改的数据库缓冲区可能写到磁盘。同样,在发出COMMIT语句前,重做日志项也可能写到重做日志中。

在提交一个Oracle事务时,发生下面三件事情。
(1)重做记录中的事务表被标记上所提交事务的唯一系统更改号(SCN)。
(2)日志写入程序将事务的重做日志信息以及事务的SCN,从重做日志缓冲区写到磁盘上的重做日志文件。在这一点上,提交被认为在Oracle中完成。
(3)释放Oracle持有的锁,Oracle标记事务为完成。

注解 如果设置SQL*Plus变量AUTOCOMMIT为ON, Oracle将自动提交事务,即使是没有明确的COMMIT语句也如此.

COMMIT语句的默认行为(这通常是遇到的唯一类型)是使用IMMEDIATE和WAIT选项。
★ IMMEDIATE与BATCH:使用IMMEDIATE选项,日志写入程序将所提交事务的重做日志记录写到磁盘。如果想要日志写入程序把重做记录写入内存缓存起来,在它方便的时候再写到磁盘,可使用BATCH选项。
★ WAIT与NOWAIT:使用WAIT选项,COMMIT语句在重做记录成功写到重做日志之后才成功返回。如果想要COMMIT语句返冋而不等待写重做日志,可使用NOWAIT选项。
默认的行为表示每次提交后有一个磁盘I/O,所以事务结束有稍微的延迟。对于某些类型的长事务,我们可能想避免频繁写重做日志记录和等待这些写的确认所导致的延迟。

可使用COMMIT_WAIT和COMMIT_LOGGING初始化参数修改此默认的行为。可使用COMMIT_WAIT参数在数据库提交重做日志后清除缓冲区时进行控制。使用COMM1T_LOGGING参数控制日志写入器批量重做的方式。



只要未提交事务,ROLLBACK语句就可以撤销或回滚SQL语句在一个事务中所做的更改。一旦发出ROLLBACK语句,自事务开始以来SQL语句所做的更改就不会记录到数据库中。可按如下使用ROLLBACK命令,通过回滚SQL语句在事务内所做的所有更改,来回滚整个事务:
ROLLBACK;

可以利用事务中的保留点(savepoint)来部分回滚一个事务。利用保留点,可回滚到事务中最后 一条SAVEPOINT命令处,如下所示:
ROLLBACK TO SAVEPOINT POINT A;

SAVEPOINT语句的作用就像事务中未提交语句的一个书签。上面的第二个例子中,仅回滚到事务的时间点A处。A之前的所有更改仍然被提交。

在发出ROLLBACK命令后,Oracle利用撤销表空间中的撤销记录进行回滚。它还释放所持有的锁,并标记事务完成。如果回滚到一个保留点,则事务被视为未完成,并可继续执行该事务。

如果SQL语句执行中出现错误,则到该点为止它所做的一切更改自动回滚,这就是所谓的语句级回滚。死锁是两个会话的SQL语句争用相同的资源时出现的情况。在这种情况下,Oracle自动回滚其中一条语句以解决死锁。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论