SavePoint(bzszp)

来源:互联网 发布:java获取当月的第一天 编辑:程序博客网 时间:2024/06/05 11:44
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

保存点(SavePoint)是事务处理过程中的一个标志,与回滚命令(ROLLBACK)结合使用,主要的用途是允许用户将某一段处理回滚而不必回滚整个事务,这在PL/SQL开发中还是很有用处的。
下面的例子中,把SavePoint标记在INSERT语句之前,如果这条INSERT语句试图将重复的数据保存到EMP表中的话,将触发执行预先定义的DUP_VAL_ON_INDEX例外处理,在这里面的ROLLBACKTOdo_insert命令将回滚上面的那条INSERT操作,而不会影响前面的任何操作。

DECLARE
  emp_id emp.empno%TYPE;
BEGIN
  UPDATEempSET...WHEREempno=emp_id;
  DELETEFROMempWHERE...
  ...
  SavePointdo_insert;
  INSERTINTOempVALUES(emp_id,...);
EXCEPTION
  WHENDUP_VAL_ON_INDEXTHEN
     ROLLBACKTOdo_insert;
END;

如果你定义了多个SavePoint,当你指定回滚到某个SavePoint时,那么回滚操作将回滚这个SavePoint后面的所有操作(即使后面可能标记了N个SavePoint)。例如,在一段处理中
你定义了五个SavePoint,从第三个SavePoint回滚,后面的第四、第五个标记的操作都将被回滚,如果不使用ROLLBACKTOSavePoint_name而使用ROLLBACK,将会滚整个事务处理。

如果你在递归子程序里面定义了一个SavePoint,如果每一个递归层都设置了SavePoint.此时,你只能回滚到最近的一个SavePoint.

SavePoint的声明可以在同一个事务处理里面重复定义.它的作用就是把SavePoint从上一个位置转移到目前的位置.因而,执行回滚也只回滚到最近的SavePoint.
下面是一个例子:

BEGIN
  ...
  SavePointmy_point;
  UPDATEempSET...WHEREempno=emp_id;
  ...
  SavePointmy_point; --movemy_pointtocurrentpoint
  INSERTINTOempVALUES(emp_id,...);
EXCEPTION
  WHENOTHERSTHEN
     ROLLBACKTOmy_point;
END;

另外,没有对每个session里面可以使用的SavePoint个数做限制.

<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击