2013-05-24 22 views
5

Hãy tưởng tượng thực hiện một truy vấn sử dụng mã tương tự như sau đây:Sau truy vấn Đọc không được cam kết, tôi có phải đặt lại nó thành Cam kết không?

using (SqlConnection TheConnection = GetSqlConnectionNoCatch(SQLConnectionStr)) 
using (SqlDataAdapter TheDataAdapter = new SqlDataAdapter(SQLStatement, TheConnection) { MissingSchemaAction = SchemaAction }) 
{ 
    DataSet TheDataSet = new DataSet(); 
    TheDataAdapter.SelectCommand.CommandTimeout = SQLTimeout; 
    TheDataAdapter.Fill(TheDataSet, TableName); 

    return TheDataSet; 
} 

Và tưởng tượng cần phải đọc một bảng cơ sở dữ liệu là hoàn toàn bị đập, không ngừng, với ghi, dẫn đến rất nhiều bế tắc và thất bại do đó bạn phải thực hiện việc đọc đó bằng cách sử dụng cấp độ cách ly đọc không cam kết.

Nếu truy vấn bình thường của tôi là:

SELECT Field1, Field2 FROM Table WHERE some_type_of_clause 

Tôi thường thấy rằng bạn sẽ thay đổi nó thành:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 
SELECT Field1, Field2 FROM Table WHERE some_type_of_clause 

OK, vì vậy đây là những gì dẫn tôi đến hỏi câu hỏi này, liên kết đặc biệt này: http://blog.sqlauthority.com/2011/04/17/sql-server-applying-nolock-hint-at-query-level-nolock-for-whole-transaction/

dụ của ông có những điều sau đây:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 
SELECT * 
FROM AdventureWorks.Sales.SalesOrderDetail sod 
INNER JOIN AdventureWorks.Sales.SalesOrderHeader soh ON 
sod.SalesOrderID = soh.SalesOrderID 
ORDER BY sod.ModifiedDate 
-- Set isolation level to original isolation level 
SET TRANSACTION ISOLATION LEVEL READ COMMITTED 

Tôi có cần đặt lại cho READ COMMITTED ở cuối truy vấn của mình không? Hoặc là đọc của tôi không cam kết chỉ tốt cho một truy vấn? Hoặc có lẽ cuộc đời của kết nối (kiểm tra mã của tôi sẽ có nghĩa là ngay sau khi tôi trả lại DataSet, vì Connection của tôi đóng ngay sau đó)?

Hầu hết các ví dụ trên web sẽ thoát khỏi 'đặt nó trở về mức cách ly ban đầu', vì vậy tôi đã làm tôi bối rối rằng anh đã bao gồm nó. Cảm ơn!

Trả lời

5

Câu trả lời ở đây có thể hữu ích: WITH (NOLOCK) vs SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Giao dịch mức cô lập là một thiết lập mức độ kết nối. Điều này có nghĩa là bất kỳ cuộc gọi thủ tục lưu trữ lồng nhau nào, vv sẽ sử dụng cài đặt mức cách ly mới của bạn, nhưng người dùng/cửa sổ truy vấn/phiên khác từ cùng một người dùng sẽ sử dụng mặc định có thể áp dụng (hoặc bất kỳ tập nào cuối cùng).

Trong trường hợp của bạn, bạn không bắt buộc phải đặt mức cách ly thành cam kết trừ khi bạn có các câu lệnh hoặc tập hợp dữ liệu khác trả về mà không được sử dụng sau này trong cùng một phiên. Đặt lại chỉ đơn giản là một thực hành tốt.

+0

Cảm ơn bạn rất nhiều vì đã phản hồi - dấu kiểm màu xanh lục và thư giới thiệu! – JustLooking

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