今天被自己神坑了,本来是编写一个触发器,题目是:当删除dept表中部门的时候删除emp表中属于该部门的所有员工。
但是我又不能真的删除表中的数据,就用设置回滚点的方法,整个过程十分谨慎,就怕稍不留神表中数据就没了,结果千防万防,还是……
以下是我整个代码过程:
(Savepoint created)
--创建a点成功
after delete
on dept
for each row
begin
delete emp where deptno=:old.deptno;
end;
(Trigger created)
--创建触发器成功
(1 row deleted)
select * from dept;
select * from emp;
--删除dept表中的数据成功,emp中的数据也成功被触发器删除。
上面操作很顺利,于是很开心的回滚了。
(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表中被我删除的数据去了。 呜呜。
相关推荐
当这个方法被调用时,Spring会自动开始一个事务,执行方法,如果一切正常则提交事务,否则回滚。这种方法比编程式事务管理(手动begin、commit、rollback)更简洁且不易出错。 然而,Spring AOP事务管理并非总是...
### hive开发中常遇到的坑 在大数据处理领域,Hive作为一款广泛使用的数据仓库工具,为用户提供了SQL查询功能,极大地简化了大数据处理过程。然而,在实际开发过程中,开发者们常常会遇到一些棘手的问题,本文将...
通过理解ActiveRecord的工作原理、正确使用事务以及细心处理数据验证,我们可以避免这些常见的“坑”,提升代码质量和可维护性。在实际开发中,对框架的理解和深入实践至关重要,这样才能充分利用其优势,同时避免...
@Transactional注解有多个参数,例如propagation、rollbackFor、noRollbackFor等,这些参数可以用来配置事务的传播行为、回滚规则等。 其中,propagation参数是用来配置事务的传播行为的,例如REQUIRED、REQUIRES_...
"salaries"表记录了员工在不同时间段的薪资变化,而"dept_manager"表则表明哪个部门由哪个员工管理,这样可以查询某个部门的负责人是谁。 学习这个数据库,我们可以练习以下知识点: 1. **SQL基础**:包括SELECT、...