2012-03-22 41 views
16

Tôi thường thấy nhiều người sử dụng câu lệnh SELECT trong một giao dịch. Tôi thường chỉ sử dụng insert/update/delete trong giao dịch. Tôi chỉ không hiểu rằng tiện ích của việc đặt một tuyên bố trong giao dịch SELECT là gì.Giao dịch SQL Server và câu lệnh SELECT

Tôi nhận được một câu trả lời .... SELECT bên trong giao dịch có thể thấy các thay đổi được thực hiện bởi các tuyên bố trước đây Insert/Update/Delete trong giao dịch đó, không thể tuyên bố SELECT bên ngoài giao dịch.

Tuyên bố trên là đúng hay không?

Đây có phải là lý do duy nhất khiến mọi người đặt câu hỏi SELECT bên trong giao dịch không? Vui lòng thảo luận tất cả các lý do chi tiết nếu có thể. nhờ

+1

Nếu bạn đang sử dụng cấp độ cách ly mặc định ('READ COMMITTED') - thì có -' SELECT' bên ngoài giao dịch sẽ ** không ** thấy bất kỳ chèn hoặc cập nhật giao dịch nào đã thực hiện, cho đến khi thực sự cam kết. –

Trả lời

16

thử làm điều này và bạn sẽ hiểu:

mở một hai truy vấn mới trên SSMS (cho phép gọi nó là A và B từ bây giờ một) và trên A, tạo ra một bảng đơn giản như thế này :

create table transTest(id int) 
insert into transTest values(1) 

bây giờ, làm như sau:

làm select * from transTest ở cả trong số họ.Bạn sẽ thấy được giá trị 1

On A chạy:

set transaction isolation level read committed 

On B chạy:

begin transaction 
insert into transTest values(2) 

On A chạy:

select * from transTest

bạn sẽ thấy rằng các truy vấn sẽ không kết thúc bởi vì nó bị khóa bởi giao dịch trên A

On B chạy:

commit transaction 

Quay trở lại A và bạn sẽ thấy rằng các truy vấn xong

Lặp lại các thử nghiệm với set transaction isolation level read uncommitted trên A bạn sẽ thấy rằng các truy vấn sẽ không được khóa bởi các giao dịch

+0

cảm ơn câu trả lời. u có thể cho tôi biết "mức độ cách ly đọc cam kết" là gì? nó có nghĩa là "mức độ cô lập đọc cam kết" theo lời giải thích của bạn nó sẽ được khóa bàn nhưng tôi muốn khóa chỉ hàng. để hướng dẫn tôi. cảm ơn – Thomas

+0

mọi giao dịch đều có mức cách ly. Đọc cam kết là mặc định và nó có nghĩa là bạn sẽ chỉ đọc dữ liệu đã được lưu vào đĩa. Bạn có thể muốn google một chút về mức độ cô lập, có rất nhiều tài liệu trên mạng và sẽ khó tóm tắt ở đây – Diego

5

Một trong những lý do chính tôi có thể nghĩ đến (lý do duy nhất, trên thực tế) là nếu bạn muốn thiết lập một khác nhau isolation level, ví dụ:

USE AdventureWorks2008R2; 
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; 
BEGIN TRANSACTION; 

SELECT * FROM HumanResources.EmployeePayHistory; 

SELECT * FROM HumanResources.Department; 

COMMIT TRANSACTION; 

Đối với báo cáo SELECT đơn, mặc dù tôi không chắc chắn như vậy, trừ khi bạn có lý do để đi theo cách khác và đặt ĐỌC KHÔNG ĐƯỢC ĐẢM BẢO trong trường hợp thời gian phản hồi/tối đa hóa đồng thời là quan trọng hơn dữ liệu chính xác hoặc hợp lệ.

< suy đoán một cách chắc chắn = "75%" > Nếu câu lệnh SELECT đơn là bên trong một giao dịch rõ ràng mà không thay đổi mức độ cách ly, tôi khá chắc chắn rằng sẽ không có hiệu lực ở tất cả. Báo cáo cá nhân là, tự mình, giao dịch được tự động cam kết hoặc cuộn lại về lỗi. </đầu cơ >

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