来自剑破冰山。
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会直接报错。