Tôi có một ứng dụng có khả năng thực hiện hàng ngàn lần chèn vào cơ sở dữ liệu SQL Server 2005. Nếu một chèn không thành công vì bất kỳ lý do nào (ràng buộc khóa ngoài, độ dài trường, vv) ứng dụng được thiết kế để ghi lại lỗi chèn và tiếp tục.SqlTransaction đã hoàn tất
Mỗi lần chèn độc lập với các trình cắm khác, vì vậy các giao dịch không cần thiết cho tính toàn vẹn của cơ sở dữ liệu. Tuy nhiên, chúng tôi muốn sử dụng chúng để đạt được hiệu suất. Khi tôi sử dụng các giao dịch, chúng tôi sẽ nhận được lỗi sau vào khoảng 1 trong số 100 cam kết.
This SqlTransaction has completed; it is no longer usable.
at System.Data.SqlClient.SqlTransaction.ZombieCheck()
at System.Data.SqlClient.SqlTransaction.Commit()
Để cố gắng theo dõi nguyên nhân tôi đặt dấu vết vào mọi hoạt động giao dịch để tôi có thể đảm bảo giao dịch không bị đóng trước khi gọi cam kết. Tôi đã xác nhận rằng ứng dụng của tôi không đóng giao dịch. Sau đó tôi chạy lại ứng dụng bằng cách sử dụng chính xác cùng một dữ liệu đầu vào và thành công.
Nếu tôi tắt ghi nhật ký, nó sẽ không thành công nữa. Bật lại và thành công. Điều này bật/tắt chuyển đổi được thực hiện thông qua app.config mà không cần phải biên dịch lại.
Rõ ràng là hành động ghi nhật ký thay đổi thời gian và làm cho nó hoạt động. Điều này sẽ chỉ ra một vấn đề luồng. Tuy nhiên, ứng dụng của tôi không phải là đa luồng.
Tôi đã nhìn thấy một mục MS KB cho biết lỗi có khuôn khổ .Net 2.0 có thể gây ra sự cố tương tự (http://support.microsoft.com/kb/912732). Tuy nhiên, sửa chữa họ cung cấp không giải quyết vấn đề này.
Sử dụng giao dịch "để đạt được hiệu suất"? Việc sử dụng các giao dịch cải thiện hiệu suất như thế nào? – LukeH
Đồng ý với luke, tại sao bạn thấy hoặc nghĩ rằng bạn có được hiệu suất bằng cách làm như vậy? – eglasius
có giao dịch xung quanh nhiều lần chèn, nói chung, tăng hiệu suất, tự kiểm tra và xem. bằng cách có một giao dịch, bạn giảm số lượng khóa bạn cần mua trước khi chèn –