Trong khi giả định của tôi có vẻ có vẻ chủ quan, sau một số nghiên cứu, tôi thấy rằng không có gì lạ khi tìm các nhà phát triển ủng hộ giả Try/Catch
thay vì sử dụng Using statement để xử lý IDbConnection/IDbTransaction
(Đóng/Cam kết/Rollback).Sử dụng IDbConnection/IDbTransaction có an toàn để sử dụng không?
Điều này đúng với một số nhà phát triển dày dạn nhất và một số nhà phát triển mới. Tôi cố ý không tham khảo bất kỳ câu hỏi nào trên StackOverflow hoặc các liên kết diễn đàn như một ví dụ, vì vậy mọi người không bị xúc phạm. Từ số what I found, tuyên bố Using là safe to use (không có ý định chơi chữ).
Có gì sai với nó không? Xét đoạn mã sau:
Public Sub Commit()
Dim cn As IDbConnection = {CREATE_CONNECTION}
Dim tran As IDbTransaction = Nothing
cn.Open()
Try
tran = cn.BeginTransaction
'run some queries here
tran.Commit()
Catch ex As Exception
If Not tran Is Nothing Then tran.Rollback()
Throw
Finally
cn.Close()
End Try
End Function
Giả {CREATE_CONNECTION}
là giữ chỗ cho một Sub
tạo ra một kết nối, tùy thuộc vào nhà cung cấp cơ sở dữ liệu, được viết theo tất cả các thông lệ tốt nhất có thể và không cần phải cải thiện nhiều hơn nữa.
Có một lý do tại sao đoạn code trên không thể được viết lại như vậy:
Using cn As IDbConnection = {CREATE_CONNECTION}
cn.Open()
Using tran As IDbTransaction = cn.BeginTransaction
'run some queries here
tran.Commit()
End Using
End Using
?
Rõ ràng, phiên bản # 2 trực quan hơn với những gì nó đang làm. Nhưng có lẽ tôi đang thiếu một cái gì đó quan trọng ở đây? Những điều như triển khai cụ thể cho nhà cung cấp thư viện truy cập dữ liệu, không gọi số Transaction.Commit
và/hoặc Connection.Close
trên Dispose
nội bộ? Phương pháp này có bị ngừng hoạt động trong tương lai gần hay không được coi là đủ rõ ràng trong mô hình lập trình hiện đại/thực tiễn tốt nhất? Công cụ dành cho nhà phát triển ứng dụng di động/đơn lẻ thiếu hỗ trợ gỡ lỗi cho từ khóa Using
?
Tôi đang tìm bất kỳ loại câu trả lời nào để hỗ trợ hoặc từ chối điểm. Tốt hơn là một báo giá với tài liệu gốc, giống như Do not use Using with IDbTransaction when ...
. Các liên kết đến blog hoặc trải nghiệm cá nhân cũng không sao.
Điều đó giải thích, cảm ơn. Chắc chắn rõ ràng hơn phiên bản # 1 của tôi. Ngoài ra +1 cho 'GetOpenConnection', tôi cũng đang hướng tới việc kết hợp' cn.Open() 'vào một số' CreateAndOpenConnection', vì nó có vẻ dư thừa để gọi mỗi lần. – Neolisk
Nếu kết nối với cơ sở dữ liệu bị đóng, giao dịch vẫn được khôi phục? Tôi hiểu bạn lo lắng hơn về việc khóa có thể. –