Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL Server - Вложени транзакции в съхранена процедура

Възможно е работата, извършена от SP2, да бъде върната назад и да не се губи работата, извършена от SP1. Но за да се случи това, трябва да напишете вашите съхранени процедури, като използвате много специфичен модел, както е описано в Обработка на изключения и вложени транзакции :

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

Не всички грешки могат да бъдат възстановени, има редица състояния на грешка, от които дадена транзакция не може да се възстанови, като най-очевидният пример е блокиране (вие сте уведомени за изключението за блокиране след транзакцията вече е отменена). Както SP1, така и [email protected] трябва да бъдат написани с помощта на този модел. Ако имате фалшив SP или искате просто да използвате съществуващи съхранени процедури, които неволно издават ROLLBACK изявления, тогава вашата кауза е загубена.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL изключение при свързване към SQL сървър

  2. Има ли комбинация от LIKE и IN в SQL?

  3. Направете, а не нарушавайте производителността на SQL Server

  4. Изтрийте всички изгледи от Sql сървъра

  5. Използвайте DB_ID(), за да върнете идентификатора на база данни в SQL Server