PL/SQL基础编程之(九)[事务的一致性、隔离性、并发性][行级触发器、语句触发器、替换触发器]...

1. 触发器: 概念: 可以看成一个特殊的过程,它是自动执行的,并且它是不允许带参数的。 利用触发器可以自动的进行一些操作,行触发器、数据触发器等等,主要是数据操纵语言的触发器 2、事务: 概念:为了确保数据完整性的能力。用于将一条或者多条sql组成一个逻辑上的单元。然后执行,这样的话结果就会都成功或者都失败。 特性阐述: 原子性:2个或者2个以上的表被操作的时候,对其中一个操作成功,其他操作不成功的时候。就出现了错误,这就是原子性起到的错误。都成功或者都失败,也就是2个组成了1个单元。 一致性:举例说明:银行账户打款说明‘汇款方减去相应的金钱、收款方也得加上相应的金钱。’ 隔离性:隔离性和并发性相结合,隔离性越强、并发性越低。正相反 Commit和Rollback: 概述: 当我们对表进行了DML修改之后,我们如果不commit我们只是对内存中的数据进行了更改,表中并没有修改。但是我们用另外一个用户查这个内容是没有变化的。 这就是事务的隔离等级。 并发性和隔离性: 概述: 2个用户对一个表同时进行查询、修改等操作。造成数据的不一致。 举例说明: 查看页面目前火车有5张票,甲买2张,乙此时也查看火车票有5张,乙买4张,这样的话火车票被卖了6次。这是不合乎情理的。所以,当我们甲如果对火车票进行操作的时候,[加锁],甲处理完成之后[解锁]。乙在甲处理的时候,它是不能对这火车票进行操作的。乙如果点击了提交、而此时系统会提示“无法完成操作,没有那么多票。”这就是降低了并发性、提高了隔离性 永久性:一旦提交了就不可以再回滚了,一旦回滚就不可以再提交了。因为提交了以后就已经改变了物理数据。所以也不能再回滚了。 触发器实际应用: 注意:触发器语句体里面是不可以写rollback语句的 RAISE_APPLICATION_ERROR(‘-20000’,’不能删除’) 两个参数分别是错误号和提示内容,实现控制触发器,错误号在 -20999----20000之间 两个重要的内存表:OLD表和NEW表 Old和New使用方式为”:old.id和:new.id” :new --为一个引用最新的列值; :old --为一个引用以前的列值; 这两个变量只有在使用了关键字 "FOR EACH ROW"时才存在.且update语句两个都有,而insert只有:new ,delect 只有:old; 触发器案例: 案例1:创建触发器 –删除dept表的行的时候,也删除emp对应的行 一、创建触发器 create or replace trigger del_dept --创建触发器 after delete on dept --在删除dept表删除动作之后触发 for each row --行级触发器 begin --触发器语句块 delete from emp where eid=:old.eid; --old表示内存表,在这里如此调用表示删除时候的dept的eid的应用 end del_dept; --结束 二、执行触发的语句 Delete from dept where eid=1; 案例2:创建触发器 –限制删除emp表的行(行级触发器) create or replace trigger del_xianzhi_dept --创建触发器 after delete on dept --在给dept表删除动作之后 for each row --行级触发器 begin if :old.eid=3 then RAISE_APPLICATION_ERROR(-20001,'cant'); --提示错误,不在进行操作 dbms_output.put_line('aaaaa'); end if; end del_xianzhi_dept; 案例3:语句级触发器 注意:语句级触发器不需要写什么for each row等 create or replace trigger ti --创建触发器 after insert or delete or update on dept --语句级触发器三种动作都可以触发的写法 begin --下面是一些逻辑处理就好 if inserting then dbms_output.put_line('I'); elsif deleting dbms_output.put_line('D'); else updating dbms_output.put_line('U'); end if; end; / 三:替换触发器只能建立到视图上,可以解决视图不能同时更新多表的问题 大家都知道2个表组成的视图是不能够对两个表同时进行操作的。然而替换触发器可以完成这个问题 create or replace trigger tr_view1 --创建触发器 instead of insert on view1 --替换触发器,在view上 for each row --行级触发器,可以用new begin --业务处理。在此时在两个表分别插入 insert into emp values(:new.id,'aaa'); insert into dept(:new.id,:new.id,'bbb'); end; /
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值