oracle事务隔离级别_笔记11:为什么重启动对我们很重要
为什么重启动对我们很重要
首先应该注意到"我们的触发器触发了两次!"表中只有一行,而且只有一个BEFORE FOR EACH ROW触发器。更新了一行,但触发器却触发了两次。
想想看这会有什么潜在的影响。如果你有一个触发器会做一些非事务性的事情,这可能就是一个相当严重的问题。例如,考虑这样一个触发器,它要发出一个更新(电子邮件),电子邮件的正文是“这是数据以前的样子,它已经修改成现在这个样子”。如果从触发器直接发送这个电子邮件,(在Oracle Database 9i中使用UTL_SMTP,或者在Oracle Database 10g及以上版本中使用UTL_MAIL),用户就会收到两个电子邮件,而且其中一个报告的更新从未实际发生过。
如果在触发器中做任何非事务性的工作,就会受到重启动的影响。考虑以下影响。
.考虑一个触发器,它维护着一些PL/SQL全局变量,如所处理行的个数。重启动的语句回滚时,对PL/SQL变量的修改不会“回滚”。
.一般认为,以UTL_开头的几乎所有函数(UTL_FILE、UTL_HTTP、UTL_SMTP等)都会受到语句重启动的影响。语句重启动时,UTL_FILE不会“取消”对所写文件的写操作。
.作为自治事务一部分的触发器肯定会受到影响。语句重启动并回滚时,自治事务无法回滚。
所有这些后果都要小心处理,要想到对于每一行触发器可能会触发多次,或者甚至对根本未被语句更新的行也会触发。
之所以要当心可能的重启动,还有一个原因,这与性能有关。我们一直在使用单行的例子,但是如果你开始一个很大的批更新,而且它处理了前100000条记录后重启动了会怎样?它会回滚前100000行的修改,以SELECT FOR UPDATE模式重启动,在此之后再完成那100000行的修改。
你可能注意到了,放上那个简单的审计跟踪触发器后(即读取:NEW和:OLD值的触发器),即使除了增加了这些新触发器外什么也没有改变,但性能可能会突然差到你无法解释的地步。你可能在重启动过去从未用过的查询。或者你增加了一个小程序,它只更新某处的一行,却使过去只运行1个小时的批处理突然需要几个小时才能运行完,其原因只是重启动了过去从未发生过的工作。
本文来源 我爱IT技术网 http://www.52ij.com/jishu/5229.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
