TECHNOLOGY

FAQ (よくある質問)

対象バージョン : SQL Anywhere (Adaptive Server Anywhere) version 9.0.x
対象OS : 全て

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トリガと同様のタイミングで発生するようになりましたので、挙動の違いはございません。