2009-02-09 46 views
28

Hãy tưởng tượng kịch bản sau đây:giao dịch lồng nhau trong SQL Server

Tôi đang sử dụng SQL Server 2005. Tôi có một giao dịch mà đang kêu gọi, trong số những câu lệnh SQL khác, một thủ tục lưu trữ mà còn có một giao dịch bên trong. Giao dịch bên ngoài đôi khi không thành công và nó được khôi phục sau khi thủ tục được lưu trữ được gọi và được thực hiện thành công.

Câu hỏi của tôi là, cuộn lùi giao dịch của quy trình được lưu trữ có còn không?

Trả lời

36

Với một giao dịch lồng nhau, một cam kết không viết bất kỳ thay đổi vào đĩa, trừ các giao dịch cấp cao nhất. Một rollback, tuy nhiên hoạt động bất kể mức độ của giao dịch, do đó, có, nó sẽ cuộn giao dịch nội bộ trở lại.

+6

Rollback sẽ rollback -all- giao dịch, không chỉ trước đó. EG: http://www.emoreau.com/Entries/Articles/2011/02/EricMoreau1.gif –

+4

@ Pure.Krome là chính xác. Các giao dịch lồng nhau sẽ * không * làm những gì bạn muốn. Xem chuỗi [SQL Server Myth a Day] (http://www.sqlskills.com/blogs/paul/post/A-SQL-Server-DBA-myth-a-day-%282630%29-nested-transactions- are-real.aspx) –

+0

Xác nhận: http://technet.microsoft.com/en-us/library/ms189336(v=sql.90).aspx – Vadzim

2

Có thủ tục được lưu trữ sẽ được khôi phục.

Đây là dòng chảy chung của mã của bạn:

BEGIN TRY 

    BEGIN TRANSACTION 

    EXEC SotredProcedureName 

    --Do some other activity 

    COMMIT TRANSACTION 
END TRY 
BEGIN CATCH 

    --IF an error occurs then rollback the current transaction, which includes the stored procedure code. 
    ROLLBACK TRANSACTION 

END CATCH 

Chúc mừng, John

7

Hoàn toàn có, giao dịch cấp cao nhất sẽ sở hữu tất cả thay đổi dữ liệu cho đến khi nó được cam kết hoặc được khôi phục.

Tuy nhiên, tôi khuyên bạn nên suy nghĩ cẩn thận về mô hình giao dịch. Càng có nhiều kịch bản như vậy tồn tại trong hệ thống của bạn thì bạn càng gặp nhiều vấn đề về khóa hơn. Ngoài ra chi phí tính toán của thủ tục tăng lên.

Điều đáng chú ý là thường xuyên, khi hợp lý hoá SQL, tôi thấy các giao dịch đã được triển khai khi chúng không được yêu cầu. Tôi khuyến khích bạn (và bất kỳ ai làm việc với các giao dịch) suy nghĩ cẩn thận về lý do tại sao bạn sử dụng chúng trong từng ngữ cảnh và điều gì sẽ xảy ra là giao dịch không được thực hiện. Chỉ có giá trị 2c của tôi!

1

Tôi đã thử bắt đầu tran và cam kết bên trong quy trình được lưu trữ nói usp_test.
Exec những sp với một số truy vấn khác như sau

update x set name='xxx' 
select * from x---contains 'xxx' 
begin tran 
update x set name='yyy' 
select * from x---contains 'yyy' 
exec usp_test 
select * from x---contains 'zzz' inside the sp 
rollback tran 

Trong khi thực hiện các tên truy vấn trên tại x bảng phải là 'xxx' không nó 'zzz' kể từ khi lần đầu tiên bắt đầu tran rollbacked ngay cả những tran sp cam kết.
Vì vậy, trước hết hãy bắt đầu tự thay đổi dữ liệu.

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