onun sistemi için özel bir müşteri ihtiyaç olduğu harf ve sayı birleştiren bir özel otomatik artış anahtarıdır.Okuma-yazma-yazma işlemi için kilit nasıl kurulur? Aşağıdaki tablo</p> <p><img src="https://i.stack.imgur.com/7QLHk.png" alt="Key(KeyId int, Sequence varchar(14))"></p> <p>sıra değerini göz önünde
Dizinin sonraki değerini döndürmesi gereken GetNextSequence() adında bir işlev yaptık. Tabloya dizisi değerini yaz dizisi değerini Ayrıştırma SELECT Sequence FROM [Key] WHERE KeyId = @Id
- KeyID kullanarak dizisi değerini oku izleyin olarak okuma ve diziyi güncellenmesi için adım gider
UPDATE [Key] SET Sequence = @Sequence WHERE KeyId = @Id
: Buradavar 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;
Bizim sorunumuz aynı diziyi erişebilmesi iki farklı sunucularda ikamet ve biz başka bir işlem kilit kaynaklardaki deadlocked ve kilitlenme kurbanı olarak seçildi çıkmaza
İşlem (Process ID X) elde sonunda. İşlemi tekrar çalıştırın. C# '
, ben tablo ipucu ROWLOCK
ve HOLDLOCK
kullanarak bir işlem izolasyon IsolationLevel.RepeatableRead
veya IsolationLevel.Serializable
veya SQL gibi farklı kilit kombinasyonunu kurmaya çalıştı, ancak başarılı olamadı.
Her sunucunun bir diziyi atomik olarak okuyabilmesi, değiştirebilmesini ve güncelleştirebilmesini istiyorum. Bu durum için bir kilit oluşturmanın uygun yolu nedir? Bir işlemin süresi boyunca özel bir satır düzeyinde kilit kullanmayı (ROWLOCK, XLOCK, HOLDLOCK) kullanmanızı öneririm
Bu sorun gibi geliyor: http://www.codinghorror.com/blog/2008/08/deadlocked.html – BrokenGlass