当前位置:首页 > 开发 > 数据库 > 正文

rollback还有谁被坑过??

发表于: 2014-10-24   作者:不打伞的蘑菇   来源:转载   浏览:
摘要:     今天被自己神坑了,本来是编写一个触发器,题目是:当删除dept表中部门的时候删除emp表中属于该部门的所有员工。    但是我又不能真的删除表中的数据,就用设置回滚点的方法,整个过程十分谨慎,就怕稍不留神表中数据就没了,结果千防万防,还是……    以下是我整个代码过程: savepoint a;

    今天被自己神坑了,本来是编写一个触发器,题目是:当删除dept表中部门的时候删除emp表中属于该部门的所有员工。
    但是我又不能真的删除表中的数据,就用设置回滚点的方法,整个过程十分谨慎,就怕稍不留神表中数据就没了,结果千防万防,还是……
    以下是我整个代码过程:

savepoint a;
(Savepoint created)

          --创建a点成功

create or replace trigger tri_delete_deptno
after delete
on dept
for each row
begin
delete emp where deptno=:old.deptno;
end;
(Trigger created)

      --创建触发器成功

delete dept where deptno=20;
(1 row deleted)
select * from dept;
select * from emp;

      --删除dept表中的数据成功,emp中的数据也成功被触发器删除。
          上面操作很顺利,于是很开心的回滚了。

rollback to a;
(ORA-01086: 从未创建保存点 'A')

      。。。。。。。
      天雷滚滚啊!不管怎么操作就是没保存啊!!顿时心里各种心凉……

      然后上网仔细各种搜索。梳理脉络,给大家解释一下这个回滚点。

     这里呢,有一个事务的概念。
     事务是用来确保数据库数据的一致性,它由一组相关的DML语句组成。该组DML语句要么全部成功提交,要么全部取消。
      数据库事务主要由INSERT,UPDATE,DELETE和SELECT...FOR UPDATE语句组成。当执行commit或rollback语句时,当前事务结束。
      使用COMMIT可以来提交事务。当执行了COMMIT后,oracle会进行确认事务变化,结束事务、删除保存点、释放锁等一系列操作。


       当然,我中间的确没有用commit,但是和我一样的菜鸟的话呢就注意以下几点了:
       1.注意当使用CREATE、ALTER、DROP、TRUNCATE等DDL语句时,oracle会自动提交事务。
       2.注意当使用GRANT、REVOKE等DCL语句时,oracle会自动提交事务。
       3.注意当使用EXIT正常退出SQL*PLUS时,oracle会自动提交事务。

 

        呵呵,所以我其实就犯了第一条错误。用create创建了一个触发器。所以在这之前的savepoint a就被删除掉了。然后提示说从未创建保存点 'A'。

       总而言之,在使用savepoint和rollback之间只能使用DML语句,而不能使用DDL语句,因为DDL是会自动提交的,在这之前的savepoint全部都会被删除掉。
       所以这里也要分清楚哪些是DDL哪些是DCL,在oracle里DML是可以rollback的,而DDL是不可以的。
       DML(Data Manipulation Language)数据操纵语言:
       适用范围:对数据库中的数据进行一些简单操作,如insert,delete,update,select等.

       DDL(Data Definition Language)数据定义语言:
       适用范围:对数据库中的某些对象(例如,database,table)进行管理,如Create,Alter和Drop.

       区别:
       1.DML操作是可以手动控制事务的开启、提交和回滚的。
       2.DDL操作是隐性提交的,不能rollback!

       好了,解决完毕,吐槽完毕,我要去回复我的dept表和emp表中被我删除的数据去了。 呜呜。

   

 

 

 

 

 

rollback还有谁被坑过??

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
最近上线一个新版本,需要在导航增加一个app的下载入口(一个图片链接),然后经过了正常的原型图、
xtrabackup相信目前使用已经非常广泛了,备份innodb表的首选工具,但是其中还是有点小坑,虽然发生
zccst转载 toFixed 保留2位小数 4舍5入 判断一个数是否是数字? a === +a 取正(+), 减零 (-0),
ListView,GrildView使用时候经常会用到缓存机制,随意一搜,例子成千上万,但是讲解都是很一致,跟
1.概述   这个标题也是用血的教训换来的,希望对刚进入hive圈的童鞋和正在hive圈爬坑的童鞋有所帮
集成google pay自然是需要相应的对接文档。官方地址:http://developer.android.com/intl/zh-cn/goo
作者:zccst 2014-12-11 toFixed 保留2位小数 4舍5入 判断一个数是否是数字? a === +a 取正(+),
前言 本篇博客整理一下笔者在Mac下使用ADT Bundle踩过的坑,Google现在也不支持Eclipse了,开发者也
此项目是一个IPad上的Web App项目,页面的滚动用了最新的IScroll 5.0 插件, 确实是挺潮的。 项目用
:first-child 选择器用于选取属于其父元素的首个子元素的指定选择器。——w3school 嗯,乍一看好像
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号