ORACLE幻读(一)

来自剑破冰山。

oracle在进行数据处理时,如果通过触发器进行了唯一性的约束控制。

在打开两个session 对话框时,就可能会出现幻读的现象。

在emp2表上建立如下触发器:
CREATE OR REPLACE TRIGGER TRI_EMP2_UNIQENAME
BEFORE INSERT OR UPDATE
OF ENAME
ON EMP2
REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
DECLARE
N SIMPLE_INTEGER:=-1;
BEGIN
   SELECT COUNT(*) INTO N FROM EMP2 WHERE ENAME=:NEW.ENAME;
   IF N>0 THEN
     RAISE_APPLICATION_ERROR(-20003, 'ENAME '||:NEW.ENAME||' EXISTS!');
   END IF;
   EXCEPTION
     WHEN OTHERS THEN
       -- Consider logging the error and then re-raise
       RAISE;
END TRI_EMP2_UNIQENAME;
在session1会话中插入数据后

在会话2session2中也可以插入,这是因为oracle有会话隔离的特性。

在session1 尚未提交之前

分别提交之后:

可以通过约束来避免这样的情况,仅针对此类约束,其他情况需要根据情况来处理。

session1中插入之后

session2(右侧)插入之后会hang住,也就是说必须等待session1的执行commit或者rollback之后session2才会继续。

如果session1 commit,那么因为违反约束,session2会直接报错。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值