来自剑破冰山。

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会话中插入数据后

ORACLE幻读(一)

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

ORACLE幻读(一)

在session1 尚未提交之前

ORACLE幻读(一)

分别提交之后:

ORACLE幻读(一)

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

ORACLE幻读(一)

session1中插入之后

ORACLE幻读(一)

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

ORACLE幻读(一)

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

ORACLE幻读(一)

相关文章: