QUESTION(SQ1010100)
BEFORE INSERTトリガの挙動がBEFORE UPDATEトリガやBEFORE DELETEトリガと異なります。
("テーブルA"のBEFOREトリガ(INSERT、UPDATE、DELETE)で、"テーブルB"の操作を行っています。このとき"テーブルA"のINSERTではデッドロックが起こりますが、UPDATEやDELETEではデッドロックが起こりません。)
ANSWER
"テーブルA"へ操作を加える前に、"テーブルA"に対するテーブルロック(LOCK
TABLE文)を行っている場合、ご質問のような現象が起こる場合がございます。
上記現象が起こるのは、SQL Anywhere 9.0.xでは、技術的な制約(製品仕様)により、以下のように、BEFORE
INSERTトリガと、BEFORE UPDATE/DELETEトリガの発生タイミングが異なる為です。
BEFORE INSERTトリガの発生タイミング:
1:トリガの発生 2:対象ローの排他ロック
BEFORE
UPDATE/DELETEトリガの発生タイミング:
1:対象ローの排他ロック 2:トリガの発生
なお、SQL Anywhere 10.0.x以降のバージョンでは、UPDATEトリガとDELETEトリガの仕様が変更され、INSERTトリガと同様のタイミングで発生するようになりましたので、挙動の違いはございません。
|