[20190218]延遲約束問題2.txt

lfree發表於2019-02-18

[20190218]延遲約束問題2.txt


--//當時遇到的問題,連結如下:

http://blog.itpub.net/267265/viewspace-2122166/ => [20160716]主外來鍵與延遲約束.txt 

http://blog.itpub.net/267265/viewspace-2122204/ => [20160719]主外來鍵與延遲約束2.txt 

 

--//其它例子:

http://blog.itpub.net/267265/viewspace-2138946/ => [20170512]延遲約束問題.txt 


--//當時因為開發沒有在2個存在主外來鍵上的表上建立約束,導致主表記錄刪除了,而外表資料還在.

--//主要問題在於開發有需求要刪除主表的記錄,由於條件寫錯,導致出現以上情況.

--//實際上oracle支援延遲約束,只有提交的時候才會檢查。 我當時也很無奈,明顯開發寫程式碼有問題

--//什麼能選擇刪除主記錄,然後再插入回去這樣的程式設計方式。

--//實際上查詢這個問題就花了整整一天時間,確定恢復時間又花不少時間,恢復資料庫到特定時間點又是一天。

--//更加嚴重事後根本沒有總結,更談不上更正程式設計方式。


--//實際上使用延遲約束,我個人認為更使用觸發器一樣,都不是很好的程式設計模式,再透過一個說明問題:


1.環境:


SCOTT@book> @ ver1

PORT_STRING                    VERSION        BANNER

------------------------------ -------------- --------------------------------------------------------------------------------

x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production


create table t(id number);

alter table t add constraint pk_t primary key (id) deferrable initially deferred ;

insert into t values (1);

insert into t values (2);

commit ;


2.測試:

--//session 1:

SCOTT@book(274,5)> insert into t values (1);

1 row created.


SCOTT@book(274,5)> commit ;

commit

*

ERROR at line 1:

ORA-02091: transaction rolled back

ORA-00001: unique constraint (SCOTT.PK_T) violated


--//插入沒有問題,但是提交會報錯。因為違反唯一性約束,這時延遲約束的特點.繼續測試:


--//session 1:

SCOTT@book(274,5)> update t set id=3 where id=2;

1 row updated.


--//session 2:

SCOTT@book(41,19)> update t set id=3 where id<=2;


--//掛起!!因為修改都包括id=2的記錄.


--//session 1:

SCOTT@book(274,5)> commit ;

Commit complete.


--//session 2:

SCOTT@book(41,19)> update t set id=3 where id<=2;

1 row updated.

--//注意僅僅修改1條。


SCOTT@book(41,19)> commit ;

Commit complete.


SCOTT@book(41,19)> select * from t;

        ID

----------

         3

         3


--//破壞了唯一性約束.

--//在12.2.0.2(for windows 64位)下測試結果也一樣。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2636215/,如需轉載,請註明出處,否則將追究法律責任。

相關文章