2013-10-30 10 views
6

Tôi có ứng dụng C# xử lý dữ liệu trong bảng trong cơ sở dữ liệu SQL Server bằng giao dịch. Mã rất đơn giản và về cơ bản giống như sau:Bảng cơ sở dữ liệu vẫn bị khóa, nếu quá trình khách hàng bị hủy sau khi bắt đầu giao dịch

public string ConnectionString; 
public OleDbConnection DbConnection; 
public OleDbTransaction DbTransaction; 

// ... some initialization stuff ... 

DbTransaction = DbConnection.BeginTransaction(); 
try 
{ 
    // ... some insert/update/delete here ... 
    DbTransaction.Commit(); 
} 
catch (Exception e) 
{ 
     // ... 
     DbTransaction.Rollback(); 
} 

Hiện tại, khách hàng đã báo cáo rằng bảng/hàng vẫn bị khóa, trong khi không có trường hợp ứng dụng đang hoạt động nào chạy. Dự đoán đầu tiên của ông là, một lỗi xảy ra trong giao dịch và không có try-catch-block với một rollback là có (nhưng điều này chắc chắn không phải là trường hợp, vì có một xử lý lỗi thích hợp). Tôi có thể tạo lại tình huống, nếu tôi đặt điểm ngắt trong trình gỡ lỗi trước DbTransaction.Commit(); và sau đó giết quá trình từ Trình quản lý tác vụ của Windows. Sau đó, giao dịch vẫn mở (tôi có thể thấy nó đang chạy DBCC OPENTRAN) và một khóa vẫn còn, mà cấm tiếp tục làm việc với một trường hợp mới của ứng dụng.

Câu hỏi của tôi: Làm thế nào tôi có thể xử lý một tình huống như thế này một cách an toàn - quá trình này bị hủy sau khi bắt đầu giao dịch và không có cơ hội thực hiện/hoàn trả giao dịch? Theo như tôi biết, tôi không thể nhận ra, nếu ứng dụng đang bị giết từ Task Manager (tab "Process"). Vì vậy, bằng cách nào đó tôi có thể tự động hủy bỏ giao dịch (ví dụ: sau một thời gian chờ) hoặc tôi có thể làm gì khác? Hãy giúp tôi.

+0

Không thực sự khắc phục nhưng bạn có thể thực hiện việc này với ít hơn khóa bàn không? Bạn có thể thực hiện các giao dịch nhỏ hơn không? – Paparazzi

Trả lời

Các vấn đề liên quan