Tôi có một khối mã chạy bên trong một TransactionScope và trong khối mã này, tôi thực hiện một số cuộc gọi đến DB. Chọn, cập nhật, tạo và xóa, toàn bộ gam màu. Khi tôi thực hiện xóa của mình, tôi thực hiện nó bằng cách sử dụng một phương thức mở rộng của SqlCommand sẽ tự động gửi lại truy vấn nếu nó bị khóa khi truy vấn này có khả năng có thể gây ra bế tắc.TransactionScope Hoàn thành sớm
Tôi tin rằng sự cố xảy ra khi bế tắc bị nhấn và hàm sẽ cố gắng gửi lại truy vấn. Đây là lỗi tôi nhận được:
Giao dịch liên kết với kết nối hiện tại đã hoàn tất nhưng chưa được xử lý. Giao dịch phải được xử lý trước khi kết nối có thể được sử dụng để thực hiện các câu lệnh SQL.
Đây là mã đơn giản mà thực hiện truy vấn (tất cả các mã dưới đây thực hiện trong phạm vi sử dụng của TransactionScope):
using (sqlCommand.Connection = new SqlConnection(ConnectionStrings.App))
{
sqlCommand.Connection.Open();
sqlCommand.ExecuteNonQueryWithDeadlockHandling();
}
Dưới đây là phương pháp mở rộng mà gửi lại biểu truy vấn bế tắc:
public static class SqlCommandExtender
{
private const int DEADLOCK_ERROR = 1205;
private const int MAXIMUM_DEADLOCK_RETRIES = 5;
private const int SLEEP_INCREMENT = 100;
public static void ExecuteNonQueryWithDeadlockHandling(this SqlCommand sqlCommand)
{
int count = 0;
SqlException deadlockException = null;
do
{
if (count > 0) Thread.Sleep(count * SLEEP_INCREMENT);
deadlockException = ExecuteNonQuery(sqlCommand);
count++;
}
while (deadlockException != null && count < MAXIMUM_DEADLOCK_RETRIES);
if (deadlockException != null) throw deadlockException;
}
private static SqlException ExecuteNonQuery(SqlCommand sqlCommand)
{
try
{
sqlCommand.ExecuteNonQuery();
}
catch (SqlException exception)
{
if (exception.Number == DEADLOCK_ERROR) return exception;
throw;
}
return null;
}
}
lỗi này xảy ra trên dòng:
sqlCommand.ExecuteNonQuery();
Cảm ơn bạn đã bỏ qua các giao dịch ngăn chặn trên các câu lệnh chọn. Điều đó đã giúp giải quyết vấn đề thời gian chờ khiến tôi phát điên. –
Câu trả lời tuyệt vời. Điều đó đã khiến tôi phát điên lên một bộ sưu tập tuyển chọn/chèn bộ sưu tập các lệnh sql. Thêm tùy chọn Suppress tự động giải quyết vấn đề. – IoChaos
Holy crap cảm ơn bạn! Tôi đã vật lộn với điều này cả ngày. Một giải pháp đơn giản như vậy. – rossipedia