Xét bảng sauLàm cách nào để thiết lập khóa cho thao tác đọc-thao tác ghi?
Giá trị chuỗi là một phong tục auto key increment kết hợp chữ cái và con số mà một nhu cầu khách hàng cụ thể cho hệ thống của mình.
Chúng tôi đã thực hiện một hàm gọi là GetNextSequence() sẽ trả về giá trị tiếp theo của chuỗi. Các bước để đọc và cập nhật các trình tự đi như sau
- Đọc giá trị chuỗi bằng cách sử dụng KeyId:
SELECT Sequence FROM [Key] WHERE KeyId = @Id
- Phân tích các giá trị chuỗi và xác định giá trị tiếp theo
- Viết giá trị chuỗi để bàn:
UPDATE [Key] SET Sequence = @Sequence WHERE KeyId = @Id
đây là mã C# (giản thể cho rõ ràng):
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;
vấn đề của chúng tôi cư trú tại đó hai máy chủ khác nhau có thể truy cập vào cùng một chuỗi và chúng tôi sẽ nhận được một bế tắc
giao dịch (Process ID X) đã bế tắc về tài nguyên khóa với quá trình khác và đã được chọn làm nạn nhân bế tắc. Chạy lại giao dịch.
Trong C#, tôi đã cố gắng để thiết lập kết hợp khóa khác nhau như một sự cô lập giao dịch IsolationLevel.RepeatableRead
hoặc IsolationLevel.Serializable
hoặc trong SQL sử dụng bảng gợi ý ROWLOCK
và HOLDLOCK
, nhưng không thành công.
Tôi muốn mỗi máy chủ có thể đọc, thao tác và cập nhật chuỗi theo cách nguyên tử. Cách thích hợp để thiết lập khóa cho tình huống này là gì?
trên một mặt lưu ý điều này nghe có vẻ như vấn đề này: http://www.codinghorror.com/blog/2008/08/deadlocked.html – BrokenGlass