USE AdventureWorks;
GO
BEGIN TRANSACTION;
GO
DELETE FROM HumanResources.JobCandidate WHERE JobCandidateID = 10;
DELETE FROM HumanResources.JobCandidate WHERE JobCandidateID = 11;
DELETE FROM HumanResources.JobCandidate WHERE JobCandidateID = 12;
GO
COMMIT TRANSACTION;
GO
Điều gì sẽ xảy ra nếu câu lệnh xóa đầu tiên không thành công? Câu lệnh xóa thứ 2 và thứ 3 có được thực hiện không? Ví dụ này không có bất kỳ xử lý lỗi nào, nó sẽ để lại một giao dịch mở trong trường hợp ngoại lệ hay SQL Server sẽ tự động quay lại giao dịch? Mở giao dịch = tài nguyên bị khóa, phải không?Có phải giao dịch ROLLBACK không?
Tôi đang quyết định có nên áp dụng TRY ... CATCH cho các thủ tục được lưu trữ sử dụng giao dịch hay không.
Tôi biết về set xact_abort on
, nhưng muốn biết điều gì xảy ra mà không có nó.
Đây là những gì tôi tìm thấy trong tài liệu - Kiểm soát giao dịch (Database Engine):
Nếu một lỗi ngăn cản việc hoàn thành một giao dịch, SQL Server tự động cuộn lại giao dịch và giải phóng mọi nguồn lực tổ chức bởi giao dịch
Tuy nhiên, tôi đọc trong các bài đăng khác rằng khôi phục tự động không được kích hoạt.
Có, sử dụng try ... catch. – Ben