Hãy thử nhìn nó theo cách này:
Thời lượng của giao dịch chỉ được xác định khi bạn gọi trans.Complete () hoặc thoát khỏi phạm vi giao dịch. Lấy đoạn mã sau:
using (var trans= new TransactionScope())
{
Threading.Sleep(99999);
trans.Complete()
}
Không có cách nào để bỏ qua một ngoại lệ về thời gian chờ khi đang thực hiện thói quen ngủ và sẽ không có ý nghĩa gì nếu điều đó xảy ra. Và do đó, việc sử dụng thời gian chờ của giao dịch (ít nhất là theo cách này) chỉ có thể đảm bảo rằng nếu giao dịch mất nhiều thời gian hơn thời gian chờ của bạn, thì giao dịch đó sẽ không được cam kết.
Nếu bạn chỉ đang thực hiện một truy vấn (mà tôi không biết bạn sử dụng các giao dịch để làm gì) thì bạn có thể đặt thời gian chờ truy vấn / lệnh (hoặc bất cứ thứ gì bạn gọi). IIRC, truy vấn của bạn sẽ trở lại ngay sau khi hết thời gian chờ.
Một cách khác là đặt thời gian chờ yêu cầu dịch vụ web của bạn và chỉ cần giả định rằng dịch vụ web mất quá nhiều thời gian để phản hồi do bất kỳ điều gì bên trong giao dịch của bạn.
CHỈNH SỬA:Bạn có thể thử:
- Tạo giao dịch của bạn trên một chuỗi khác và sau đó đợi nó hoàn tất (sử dụng Thread.Join (thời gian chờ)) trên chuỗi chính của bạn (một chuỗi được sử dụng bởi lệnh gọi dịch vụ web). Vì vậy, nếu nó không kết thúc trước thời gian chờ bạn đã chỉ định thì bạn có thể ngừng chờ đợi và trả về lỗi hết thời gian chờ (đừng quên ra hiệu cho chuỗi khác để hủy giao dịch).
- Giả sử bạn chỉ thực hiện các truy vấn SQL bên trong các giao dịch đó, bạn có thể sử dụng từ khóa "BẮT ĐẦU GIAO DỊCH" để chỉ định giao dịch trong tập lệnh sql (thực sự là khó). Sau đó, bạn có thể chỉ định thời gian chờ lệnh và thực hiện tất cả điều này trong một dòng mã duy nhất. Nhưng sau đó, điều này đòi hỏi bạn phải chuyển mọi thứ bạn làm bên trong giao dịch sang một tập lệnh sql có thể có hoặc có thể không thực hiện được đối với bạn ... và nó không sạch sẽ.