Tôi muốn đề xuất một mẫu giống như mẫu từ Xử lý ngoại lệ và Giao dịch lồng nhau :
create procedure [usp_my_procedure_name]
as
begin
set nocount on;
declare @trancount int;
set @trancount = @@trancount;
begin try
if @trancount = 0
begin transaction
else
save transaction usp_my_procedure_name;
-- Do the actual work here
lbexit:
if @trancount = 0
commit;
end try
begin catch
declare @error int, @message varchar(4000), @xstate int;
select @error = ERROR_NUMBER(), @message = ERROR_MESSAGE(), @xstate = XACT_STATE();
if @xstate = -1
rollback;
if @xstate = 1 and @trancount = 0
rollback
if @xstate = 1 and @trancount > 0
rollback transaction usp_my_procedure_name;
raiserror ('usp_my_procedure_name: %d: %s', 16, 1, @error, @message) ;
end catch
end
Mẫu này kiểm tra XACT_STATE()
khối bắt để bảo vệ chống lại các giao dịch không đáng có :
Giao dịch không thể chấp nhận và XACT_STATE
Nếu một lỗi được tạo trong khối TRY làm cho trạng thái của giao dịch hiện tại bị vô hiệu, giao dịch được phân loại là một giao dịch không thể chấp nhận được. Một lỗi thông thường kết thúc một giao dịch bên ngoài khối TRY khiến giao dịch đi vào trạng thái không thể khắc phục khi lỗi xảy ra bên trong khối TRY. Một giao dịch không thể chấp nhận chỉ có thể thực hiện các hoạt động đọc hoặc GIAO DỊCH ROLLBACK. Giao dịch không thể thực thi bất kỳ câu lệnh Transact-SQL nào sẽ tạo ra thao tác ghi hoặc GIAO DỊCH GIAO DỊCH. Hàm XACT_STATE trả về giá trị -1 nếu giao dịch đã được phân loại là giao dịch không thể chấp nhận được. Khi một đợt kết thúc, Cơ sở dữ liệu sẽ khôi phục mọi giao dịch không hoạt động. Nếu không có thông báo lỗi được gửi khi giao dịch vào trạng thái không thể kiểm soát được, khi lô kết thúc, một thông báo lỗi sẽ được gửi đến ứng dụng khách. Điều này chỉ ra rằng một giao dịch không đáng có đã được phát hiện và khôi phục.
Mã của bạn đang kiểm tra @@TRANCOUNT
ở những nơi không thể bằng 0, nó sử dụng hỗn hợp các thông báo PRINT thông tin và bộ kết quả CHỌN để truyền đạt thành công, nó không xử lý các lỗi có thể phục hồi. Lý tưởng nhất là các ngoại lệ nên truyền tới khách hàng, trong trường hợp này là công việc Đại lý (nghĩa là sản lượng khai thác của bạn sẽ được nâng lên lại).