2009-03-13 25 views
69

Tôi đã có một IDbTransaction trong một tuyên bố sử dụng nhưng tôi không chắc chắn nếu nó sẽ được cuộn lại nếu một ngoại lệ được ném trong một tuyên bố sử dụng. Tôi biết rằng một tuyên bố sử dụng sẽ thực thi các kêu gọi của Dispose() ... nhưng không ai biết nếu cùng là đúng cho Rollback()?Một câu lệnh sử dụng có hoàn trả một giao dịch cơ sở dữ liệu nếu xảy ra lỗi không?

Cập nhật: Ngoài ra, tôi có cần gọi Commit() một cách rõ ràng như tôi có bên dưới hoặc cũng sẽ được quản lý bằng câu lệnh sử dụng không?

Mã của tôi trông loại như thế này:

using Microsoft.Practices.EnterpriseLibrary.Data; 

... 

using(IDbConnection connection = DatabaseInstance.CreateConnection()) 
{ 
    connection.Open(); 

    using(IDbTransaction transaction = connection.BeginTransaction()) 
    { 
     //Attempt to do stuff in the database 
     //potentially throw an exception 
     transaction.Commit(); 
    } 
} 
+3

Xin chào, chỉ cần làm rõ trường hợp "cam kết". Nó là khóa học bắt buộc bởi vì, using() {} chỉ cần gọi phương thức Dispose(). Lớp Transaction.Dispose không thể biết nó có nên Commit hay Dispose nếu Commit cũng tự động không :) –

+0

Xem thêm http://stackoverflow.com/questions/6418992/is-it-a-better-practice-to-explicitly -call-transaction-rollback-or-let-an-except – nawfal

Trả lời

85

Rõ ràng có (đối với SQL Server). Đây là cách phương thức Dispose SqlInternalTransaction (mà Vứt bỏ SqlTransaction của gọi) trông giống như từ Reflector:

private void Dispose(bool disposing) 
{ 
    // ... 
    if (disposing && (this._innerConnection != null)) 
    { 
     this._disposing = true; 
     this.Rollback(); // there you go 
    } 
} 

EDIT: @Medinoc nói rằng OracleConnection không làm điều đó vì có vẻ như thực hiện cụ thể.

+0

Nó sẽ, tôi thậm chí đã thử nghiệm điều này một lần bằng cách ném một ngoại lệ. –

+0

Thật tuyệt vời! Một câu hỏi trong tâm trí của tôi bây giờ mặc dù là tôi cần phải rõ ràng gọi cam kết ... hoặc sẽ sử dụng tuyên bố xử lý rằng một trong những quá hiệu quả làm cho cam kết cam kết hiện tại của tôi dư thừa. – mezoid

+1

Điều đó * là * tuyệt vời, nhưng nó có hoạt động cho các triển khai IDbTransaction khác nếu bạn đang sử dụng nó cho khả năng tương thích cross-db không? –

4

Tôi tin rằng nếu có ngoại lệ như vậy thì Commit() chưa bao giờ được gọi, thì giao dịch sẽ tự động quay trở lại.

+0

Vâng đó là sự hiểu biết của tôi. Một cuộc sống giao dịch cho đến khi một cam kết được gọi hoặc kết nối kết thúc. Tại thời điểm đó, nhật ký giao dịch thực sự được cập nhật với các thay đổi hoặc được khôi phục trong trường hợp kết nối bị đóng (bạn biết rằng bạn sẽ không bao giờ nhận được một cam kết từ một kết nối đã đóng;)). – Mike

17

Bạn phải gọi cam kết. Tuyên bố sử dụng sẽ không cam kết bất cứ điều gì cho bạn.

+5

Có, việc sử dụng sẽ gọi Dispose khi thoát, sẽ gọi Rollback, chứ không phải Cam kết. – awe

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