2010-03-31 34 views
6

Làm việc với SQL/ADO, khiến tôi suy nghĩ về điều gì đó mà tôi nghĩ nên được bao gồm một cách hợp lý với khung .net, và tôi đã tự hỏi liệu có tồn tại một điều như vậy không, hãy để tôi giải thích..net, bạn có nhận được đối tượng giao dịch không?

Có một đối tượng mà bản chất là một người quản lý giao dịch, bạn vượt qua các lệnh (hạng mục công trình) đến và đi cùng tôi sẽ tưởng tượng nó sẽ là cần thiết cũng vượt qua các hành động rollback cho từng hạng mục công trình trong giao dịch.

Ví dụ

phép nói rằng tôi muốn thực hiện các hành động sau đây:

  1. Tạo một thư mục
  2. Tạo một tập tin trong thư mục này
  3. Thực hiện một số nhiệm vụ misc khác như phím chỉnh sửa reg , hoặc hành động thực sự bạn có thể nghĩ về điều đó có thể được khôi phục.

Hiện tại nếu có điều gì đó không thành công, tôi cần thực hiện thủ công chiến lược quay lại, vì vậy có lẽ cách tồn tại để quản lý các mục công việc này dưới dạng giao dịch bằng chức năng oob .net?

Cân nhắc của tôi là sẽ yêu cầu nhiều mục tự động quay lại, nhưng có khả năng kiểm soát thủ công những gì xảy ra trong thời gian khôi phục cho mỗi mục công việc, có vẻ thực tế.

Một điều khác là những gì Microsoft đã làm với LINQ thực sự tuyệt vời, có hiệu quả có SQL như truy vấn cho tất cả các loại công cụ, không chỉ cho các bảng SQL. Vì vậy, có lẽ có một số mô hình giao dịch với LINQ?

Cảm ơn, nếu bạn biết bất cứ điều gì như thế này?

Trả lời

0

Thông thường các giao dịch theo nghĩa này ngụ ý DB IO và không phải là các hoạt động của hệ thống tệp. Trong ADO.Net 2.0, bạn sẽ làm một cái gì đó giống như mã dưới đây.

Đối với các loại giao dịch khác, tôi khuyên bạn nên xem xét MS DTC (Điều phối viên giao dịch phân tán). Điều này sẽ cho phép các giao dịch của bạn mở rộng các máy khác nhau và tôi cũng tin rằng cho phép bạn tranh thủ các hành động tùy chỉnh được khôi phục.

Tôi hy vọng điều này sẽ hữu ích.

using (SqlConnection connection = 
      new SqlConnection(connectionString)) 
{ 
    SqlCommand command = connection.CreateCommand(); 
    SqlTransaction transaction = null; 

    try 
    { 
     // BeginTransaction() Requires Open Connection 
     connection.Open(); 

     transaction = connection.BeginTransaction(); 

     // Assign Transaction to Command 
     command.Transaction = transaction; 

     // Execute 1st Command 
     command.CommandText = "Insert ..."; 
     command.ExecuteNonQuery(); 

     // Execute 2nd Command 
     command.CommandText = "Update..."; 
     command.ExecuteNonQuery(); 

     transaction.Commit(); 
    } 
    catch 
    { 
     transaction.Rollback(); 
     throw; 
    } 
    finally 
    { 
     connection.Close(); 
    } 
} 
5

Bạn có thể sử dụng lớp TransactionScope để bắt đầu một giao dịch, nhưng bất kỳ hành động của bạn trong giao dịch đó phải là "giao dịch nhận thức" và biết làm thế nào để bù đắp nếu giao dịch được cuộn lại.

Brent VanderMeide đã thực hiện chuỗi hai phần về dnrTV về cách viết các lớp học về TransactionScope. Đây là part 1 và đây là part 2.

+0

Điều này có vẻ rất hứa hẹn, có vẻ như không chỉ giới hạn ở cơ sở dữ liệu đúng không? –

+0

Không phải là tôi biết, không. Kiểm tra các video - các lớp Brent viết không phải là IIRC liên quan đến db. –

+0

Phạm vi giao dịch tuyệt vời ở chỗ bạn có thể đặt mã .net bạn chưa viết bên trong giao dịch của mình. –

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