SQLServer2005で行ロックには「for update」は使えないっぽい。

[codesyntax lang=”sql” lines=”no”]
SELECT
*
FROM
TABLE_NAME
WITH
(ROWLOCK,UPDLOCK)
WHERE
ID=1
[/codesyntax]

こんな感じで行ロック、更新ロックをかける
msdnのこの辺に書かれている。

ColdFusin8にて

[codesyntax lang=”cfm” lines=”no”]
<cftransaction action=”begin” isolation=”read_committed”>
ここにロックをかけたいSELECT文のCFQuery
SQLServer2005でのROWLOCKなどは書かない。
<cftransaction action=”commit”/>
</cftransaction>
[/codesyntax]

この状態で同時実行をするとSQLServerのデフォルトインストール状態では
SELECT文で待機はかからない。(ここまでは実際に確認)
トランザクションのなかにUPDATE文があるとUPDATE文が実行されたあとコミットするまでの間は
待機状態になる。(ここも確認)
SELECT文が待機にならないと採番処理のようなところで同じ番号を取得してくる可能性があるんで使えんな(つうか使いたくねぇ)。

調べたところ、SQLServer2005の「READ_COMMITTED_SNAPSHOT」というものがデフォルトだとOn状態の為らしい。
で、「READ_COMMITTED_SNAPSHOT」をOffに変更するとSELECT文でもコミットされるまで待機をするようになる。
(ここは未確認)

どっちがいいのかは使用目的によるんかねぇ。
つうか、デフォルトで「READ_COMMITTED_SNAPSHOT」をOffにしとけっての。
やっぱ使う気がせんDBMSやなぁ。

結論としては、
cftransactionではisolationは別に書く必要ない。
CFQueryの中で「ROWLOCK,UPDLOCK」を書けば済む。
汎用的に複数の種類のDBで使用するクエリーだったらSQLServer2005の「READ_COMMITTED_SNAPSHOT」をOffにして「isolation=”read_committed”」でたぶんOKなはず。

カテゴリー: SQLServer