11、oracle数据库下的事务和触发器

ORACLE下的事务和触发器

1.事务

事务是数据库的一种机制,当执行一系列操作时,事务可以保证这一系列操作都能完成,在此期间如果出现问题,则这一系列操作导致的结果均回退到原始状态。这样就保证了数据的一致性,事务在数据库种是极其重要的。

1.1 事务的特点

事务的特点简单说就是ACID。原子性,组成事务处理的语句是一个整体,不能只执行其中的一部分;一致性,在事务执行前后,数据库是一致的;隔离性,一个事务处理对另一个事务处理的影响;持续性:事务处理的效果会被永久保存下来。一个事务只会有一个结果,要么都执行,要么都不执行。

1.2 事务的提交和回滚

Oracle种使用commit和roolback来控制事务的提交和回滚。这里有一个保存点的概念,意思是可以通过创建保存点的方式指定事务回退的“点”。如下实例:

-- 创建保存点1

savepoint a1;

-- 执行sql操作
update user set name='' where id = 1;

-- 创建保存点2
savepoint a2

-- 执行sql操作
delete user where id = 2;

-- 如果出问题了,回滚到保存点2

Roolback to a2;

-- 提交(提交之后是无法回滚的)
commit;

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值