2009-01-27 40 views
5

Tôi đã lưu các thủ tục trong SQL Server T-SQL được gọi từ .NET trong phạm vi giao dịch.Cách thực hiện chèn và cập nhật bên ngoài giao dịch trong T-SQL

Trong quy trình lưu trữ của tôi, tôi đang thực hiện một số ghi nhật ký cho một số bảng kiểm tra. Tôi chèn một hàng vào bảng kiểm toán, và sau đó sau đó trong giao dịch điền vào nó với nhiều thông tin hơn bằng cách cập nhật.

Điều tôi đang tìm kiếm, đó là nếu một vài người thử cùng một điều cùng một lúc, 1 hoặc 2 trong số họ sẽ trở thành nạn nhân bế tắc giao dịch. Tại thời điểm này tôi giả định rằng một số loại khóa đang xảy ra khi tôi chèn vào các bảng kiểm toán.

Tôi muốn thực hiện chèn và cập nhật cho các bảng kiểm tra bên ngoài giao dịch mà tôi đang thực thi, để việc kiểm tra sẽ diễn ra, ngay cả khi giao dịch quay lại. Tôi đã hy vọng rằng điều này có thể ngăn chặn bất kỳ ổ khóa xảy ra, cho phép nhiều hơn một người để thực hiện các thủ tục cùng một lúc.

Có ai có thể giúp tôi thực hiện việc này trong T-SQL không?

Cảm ơn, Giàu

Update- Tôi đã kể từ khi phát hiện ra rằng kiểm toán là không liên quan đến bế tắc giao dịch, nhờ gợi ý của việc sử dụng SQL Profiler Josh để theo dõi xuống là nguồn gốc của sự bế tắc.

+0

bạn có kiểm tra bảng có khóa ngoài với bảng 'nóng' chính của mình không? –

+0

Loại - nếu tôi đang chèn một hàng mới, tôi tạo một bản ghi kiểm tra 'chèn'. Sau đó, tôi tạo hàng mới, bao gồm cả khóa từ bảng kiểm toán để hiển thị hành động được kiểm tra nào đã tạo hàng. Sau đó, tôi cập nhật bản ghi kiểm tra với ID của hàng mới, để hiển thị những gì đã được tạo. Không có mối quan hệ mặc dù. – Rich

+0

Ok Tôi chỉ googled: ngăn chặn giao dịch sql, và câu hỏi này là liên kết thứ ba nghĩ rằng đó là funny – JoshBerke

Trả lời

1

Tại sao bạn cập nhật bảng kiểm tra? Nếu bạn chỉ làm chèn, bạn có thể giúp ngăn chặn sự leo thang khóa. Bạn cũng đã kiểm tra dấu vết bế tắc để xác định chính xác bạn đang bế tắc?

Bạn có thể thực hiện việc này bằng cách bật trace flag 1204. Hoặc chạy SQL Profiler. Điều này sẽ cung cấp cho bạn thông tin chi tiết sẽ cho bạn biết loại bế tắc (khóa, chủ đề, song song, v.v ...).

Khám phá bài viết này trên Detecting and Ending Deadlocks. Một cách khác để thực hiện kiểm toán là tách rời giao dịch kinh doanh bằng cách gửi tất cả các sự kiện ghi vào hàng đợi ở tầng ứng dụng, điều này giảm thiểu việc ghi nhật ký tác động vào giao dịch kinh doanh của bạn. ứng dụng.

+0

Tôi tạo một bản ghi kiểm toán, sau đó tạo hàng, sau đó cập nhật bản ghi kiểm tra với id của hàng để hiển thị những gì đã được tạo. Điều này cho phép tôi đặt id của bản ghi kiểm toán vào hàng để hiển thị sự kiện được kiểm tra nào gây ra nó – Rich

+0

Tại sao không chỉ tạo bản ghi kiểm toán khi bạn đã chèn. Tôi có cảm giác đó là vấn đề của bạn, – JoshBerke

+0

Bởi vì bản thân bản ghi sẽ không có thông tin về hồ sơ kiểm toán đã tạo ra nó - tôi thích liên kết hai chiều. – Rich

1

bạn có thể lưu kiểm toán của mình vào biến bảng (không bị ảnh hưởng bởi giao dịch) và sau đó ở cuối SP của bạn (ngoài phạm vi giao dịch) chèn hàng vào bảng kiểm tra.

Tuy nhiên, có vẻ như bạn đang cố khắc phục các triệu chứng thay vì vấn đề. bạn có thể muốn theo dõi các deadlocks và sửa chúng.

5

TranactionScope hỗ trợ Suppress:

using (TransactionScope scope = new TransactionScope()) 
{ 

    // Transactional code... 


    // Call a SQL stored procedure (but suppress the transaction) 
    using (TransactionScope suppress = new TransactionScope(TransactionScopeOption.Suppress)) 
    { 
     using (SqlConnection conn = new SqlConnection(...)) 
     { 
      conn.Open(); 
      SqlCommand sqlCommand = conn.CreateCommand(); 
      sqlCommand.CommandType = CommandType.StoredProcedure; 
      sqlCommand.CommandText = "MyStoredProcedure"; 
      int rows = (int)sqlCommand.ExecuteScalar(); 
     } 
    } 

    scope.Complete(); 

} 

Nhưng tôi sẽ phải đặt câu hỏi về lý do tại sao đăng nhập/kiểm toán sẽ chạy bên ngoài của giao dịch? Nếu giao dịch được khôi phục, bạn vẫn sẽ có các bản ghi kiểm toán/ghi nhật ký đã cam kết và đó có thể không phải là những gì bạn muốn.

Bạn chưa cung cấp nhiều thông tin về cách bạn đăng nhập. Bảng kiểm tra của bạn có các khóa ngoại tiếp trở lại các bảng hoạt động chính của bạn không? Nếu vậy, hãy loại bỏ các khóa ngoài (giả sử các bản ghi kiểm toán chỉ đến từ các ứng dụng 'đã biết').

+0

Xin chào, tôi đã sau khi áp đặt giao dịch trong T-SQL thay vì .NET. Không có khóa ngoại với các mối quan hệ nhưng tôi ghi lại các khóa của các bảng có liên quan, đến và từ bảng kiểm toán. – Rich

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