2009-06-09 9 views
2

私は知りたかったのですが、これと並行性の問題がありますか?UPDATE count = count + 1の同時性はありますか?

これはトランザクションではありません。このコードはSqlite(prototype)のためですが、私は私が間違っているかもしれないが、私はあなたが問題を抱えているとは思わないMySQLやMS

   command.CommandText = 
        "UPDATE tag_name SET count = count+1 "+ 
        "WHERE [email protected]"; 
       command.Parameters.Add("@tagid", DbType.Int64).Value = tagId; 
       command.ExecuteNonQuery(); 
+4

WHERE句でカウントを参照しないように注意してください。さもなければ、あなた自身の「ハロウィーンの問題」(http://en.wikipedia.org/wiki/Halloween_Problem) –

+0

+1がハロウィーンの問題に言及するために終わるかもしれません。私はあなたがそれを言及しなかったならば、私はその問題に遭遇して、一日中(または週!)+1000の問題について不思議/不平を言うだろうと確信しています:) –

+0

私のバグのどれもウィキペディアで終わらないことを願っています! –

答えて

4

これは問題ではありません。デフォルトでは、ロック機構は単一のステートメント内の並行性の問題を処理する必要があります。

4

からSQLのどちらかでそれを使用する予定。私が思うには、UPDATEが発生している間ロックされると思うtag_nameテーブルは、実行待ちの他のアップデートが本質的に並行して発生するのではなく、キューに入れられます。

2

私はそうは思わないが、私はMicrosoftのSQLサーバーのベストプラクティスの例でこれを見ていることを覚えている。

2

問題ありませんとにかく暗黙のトランザクションがあります。だからそれは問題ではありません。

TRANSACTION ISOLATION LEVELを変更しても、少なくともSQLServerでは正常に動作するはずです。