2011-09-14 6 views
5

を計算し、私は1つのトランザクションで次の操作を実行したい:初心者SQLトランザクションの質問:読み取りでレースを防止 - -write

  • 列の値が特定の条件に一致した場合、書き出すコラム
  • を読みます列の新しい値

トランザクション分離は読み取りコミットに設定され、サーバーはSQLサーバーです。

私はそれを読み取った後、別のトランザクションが 列に別の値を書き込まないようにするにはどうすればよいですか?別のトランザクションが列を変更した場合、サーバーは書き込みを拒否しますか?

つまり、SQL Serverを指定された列の分散ロックとして使用できますか?

答えて

1

この場合、REPEATABLE READの分離レベルを使用する必要があります。 READ COMMITTEDで別の取引でレコードを変更することができます。
1つのクエリでロジックを書き換えることができる場合(たとえば、updateまたはmerge)、READ COMMITTEDを引き続き使用できます。しかし時にはそれは選択肢ではありません。あなたのSELECT文でテーブルヒントREPEATABLEREADを使用します(詳細についてはSee

:たとえば、私が言及するのを忘れてしまった別のオプションは、

SELECT ... ; 
IF some_condition 
BEGIN 
    // execute a procedure, select from other tables, etc 
END 
ELSE 
BEGIN 
    // execute another procedure, do some other stuff 
END; 
// finally update the record 
UPDATE .... 

更新

あり

4

誰が最初にそれを読む必要があると言われましたか?

UPDATE yourtable 
SET yourcolumn = CASE 
         WHEN certaincondition = 1 THEN 'newvalue' 
         ELSE yourcolumn 
        END 
WHERE id = 'yourid' 

UPDATEの内部で評価します。完全に隔離されていることが保証されています。異なるインスタンスから複数のトランザクションを実行すると、トランザクションは1つずつキューに入れられて処理されます。