次の表読み取り/書き込み/書き込み操作のロックを設定するにはどうすればよいですか?
を考慮すると、シーケンス値が自分のシステムのための特定のクライアントのニーズその文字と数字を組み合わせた独自の自動インクリメントキーです。
シーケンスの次の値を返すGetNextSequence()という関数を作成しました。テーブルにシーケンス値を書くのシーケンス値を解析SELECT Sequence FROM [Key] WHERE KeyId = @Id
- がKEYIDを使用してシーケンス値を読む従うとして読み込み、シーケンスを更新するステップが行く
UPDATE [Key] SET Sequence = @Sequence WHERE KeyId = @Id
ここ
(明確にするために簡略化)C#コードである:
var transaction = connection.BeginTransaction(IsolationLevel.RepeatableRead);
var currentSequenceValue = SqlUtils.ExecuteScalar(connection, transaction, "SELECT Sequence FROM [Key] WHERE KeyId = @Id", new SqlParameter("@Id", keyId));
var updatedSequenceValue = ParseSequence(currentSequenceValue);
SqlUtils.ExecuteScalar(connection, transaction, "UPDATE [Key] SET Sequence = @Sequence WHERE KeyId = @Id", new SqlParameter("@Id", keyId), new SqlParameter("@Sequence", updatedSequenceValue));
transaction.Commit();
return updatedSequenceValue;
私たちの問題は、同じ配列にアクセスできる2台の異なるサーバーに存在し、私たちはデッドロック
トランザクション(プロセスID X)を取得し終わるのロックリソースを別のプロセスがデッドロックされ、デッドロックの対象として選択されています。トランザクションを再実行します。 C#ので
は、私はテーブルヒントROWLOCK
とHOLDLOCK
を使用してトランザクション分離IsolationLevel.RepeatableRead
またはIsolationLevel.Serializable
またはSQLのように異なるロックの組み合わせを設定しようとしたが、成功しませんでした。
各サーバーは、アトミックな方法でシーケンスを読み取り、操作し、更新することができます。この状況でロックを設定する適切な方法は何ですか?
これはこの問題のようです:http://www.codinghorror.com/blog/2008/08/deadlocked.html – BrokenGlass