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;
/

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值