ORACLE下的事务和触发器
1.事务
事务是数据库的一种机制,当执行一系列操作时,事务可以保证这一系列操作都能完成,在此期间如果出现问题,则这一系列操作导致的结果均回退到原始状态。这样就保证了数据的一致性,事务在数据库种是极其重要的。
1.1 事务的特点
事务的特点简单说就是ACID。原子性,组成事务处理的语句是一个整体,不能只执行其中的一部分;一致性,在事务执行前后,数据库是一致的;隔离性,一个事务处理对另一个事务处理的影响;持续性:事务处理的效果会被永久保存下来。一个事务只会有一个结果,要么都执行,要么都不执行。
1.2 事务的提交和回滚
Oracle种使用commit和roolback来控制事务的提交和回滚。这里有一个保存点的概念,意思是可以通过创建保存点的方式指定事务回退的“点”。如下实例:
-- 创建保存点1 savepoint a1; -- 执行sql操作 -- 创建保存点2 -- 执行sql操作 -- 如果出问题了,回滚到保存点2 Roolback to a2; -- 提交(提交之后是无法回滚的) |
1.3事务提交前后的数据可见性
事务提交前,改变前的数据状态是可以恢复的,执行DML操作的用户可以通过SELECT 语句查询之前的修正,其他用户看不到当前用户所做的改变,直到当前用户结束事务,也就是提交事务。
事务提交后,数据的改变已经被保存到数据库中,改变前的数据已经丢失,所有用户可以看到结果,所有保存点被释放。一经提交,无法恢复。
2.触发器
触发器是一个与表相关联的、存储的PL/SQL程序,每当一个DML语句在表上发生时,oracle会自动执行触发器中的语句序列,触发器是在执行DML语句时,自动调用的。触发器可用于数据确认、实施复杂的安全性检查、跟踪表上的所有数据操作、数据的备份和同步等。
2.1 触发器的类型
触发器有两种类型:语句级触发器、行级触发器(FOR EACH ROW)
2.2 触发器的解释
触发器这个组件,我觉得可以称作为组件,光凭概念去理解可能会很抽象,通俗易懂的说触发器就相当于是一个监听器,当对表执行DML语句时,如果指定的对象上添加了触发器,则会执行触发器所定义的动作,我目前所认识的触发器指定定义到指定表上,接下来看几个例子理解一下。
2.3 触发器的应用
创建一个行级触发器,当更新数据表种记录时,将会执行打印“update table”的动作:
Create or replace trigger trigger1 Before update On person for each row Decclare Begin Dbms_output.put_line(“update table”); End; |
触发器中有:OLD和:NEW两个声明,意思是获取到制定操作之前对应行数据的旧值和新值,可以针对insert、update、delete操作进行修饰,不过需要注意的是,绑定到insert操作上的触发器中不能使用:OLD,绑定到delete操作上的触发器不能使用:NEW。可以思考一下为什么不能用。(insert之前有旧值么?)
好了,理论说了一大堆,下边写几个历史上用来做触发器入门的例子吧。
-- 在person表上添加行级触发器,用来监听插入之前的操作,禁止开头为A的名字添加到person表 Create or replace trigger t1 Before insert on person for each row Begin Dbms_output.put_line(‘hello’||:NEW.id||:NEW.name); If :NEW.name like ‘A%’ then Raise_APPLICATION_ERROR(-20000,’不允许写入以A开头的 名字’); End if; End;
-- 验证操作 Set serveroutput on; Insert into person values(‘id’,’ABC’); -- 禁止插入,提示错误信息
|
-- 限制修改的年龄大于之前的年龄 Create or replace trigger t2 Before update on user for each row Begin If :NEW.age < :OLD.age then -- 提示错误信息 End if; End; |
-- 同时添加insert、update、delete三种类型操作对应的触发器 Crete or replace trigger t3 Before insert or update or delete on user Declare Begin -- 操作 End; |
查看创建了哪些触发器: SELECT * FROM USER_TRIGGERS |