Aracılığıyla paylaş


KAYDET IŞLEMI (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL veritabanı

Bir işlem içinde bir kayıt noktası ayarlar.

Transact-SQL söz dizimi kuralları

Syntax

SAVE { TRAN | TRANSACTION } { savepoint_name | @savepoint_variable }  
[ ; ]  

Arguments

savepoint_name
Kayıt noktasına atanan addır. Kayıt noktası adları tanımlayıcıların kurallarına uygun olmalıdır, ancak 32 karakterle sınırlıdır. SQL Server örneği büyük/küçük harfe duyarlı olmasa bile savepoint_name her zaman büyük/küçük harfe duyarlıdır.

@ savepoint_variable
Geçerli bir kayıt noktası adı içeren kullanıcı tanımlı değişkenin adıdır. Değişkenin char, varchar, nchar veya nvarchar veri türüyle bildirilmesi gerekir. Değişkene 32'den fazla karakter geçirilebilir, ancak yalnızca ilk 32 karakter kullanılır.

Remarks

Kullanıcı bir işlem içinde bir kayıt noktası veya işaretçi ayarlayabilir. Kayıt noktası, işlemin bir bölümü koşullu olarak iptal edilirse işlemin döndürebileceği bir konum tanımlar. Bir işlem bir kayıt noktasına geri alınırsa, gerekirse daha fazla Transact-SQL deyimi ve bir COMMIT TRANSACTION deyimiyle tamamlanmaya devam etmelidir veya işlemi yeniden başlangıcına döndürerek tamamen iptal edilmelidir. İşlemin tamamını iptal etmek için ROLLBACK TRANSACTION transaction_name formunu kullanın. İşlemin tüm deyimleri veya yordamları geri alınıyor.

Bir işlemde yinelenen kayıt noktası adlarına izin verilir, ancak kayıt noktası adını belirten ROLLBACK TRANSACTION deyimi, işlemi yalnızca bu adı kullanarak en son SAVE TRANSACTION öğesine geri alır.

SAVE TRANSACTION, BEGIN DISTRIBUTED TRANSACTION ile açıkça başlatılan veya yerel bir işlemden yükseltilen dağıtılmış işlemlerde desteklenmez.

Important

savepoint_name belirten ROLLBACK TRANSACTION deyimi, yükseltmeler ve dönüştürmeler dışında, kayıt noktasının ötesinde alınan tüm kilitleri serbest bırakır. Bu kilitler serbest bırakılmaz ve önceki kilit moduna geri dönüştürülmez.

Permissions

Genel rolde üyelik gerektirir.

Examples

Aşağıdaki örnekte, saklı yordam yürütülmeden önce etkin bir işlem başlatılırsa yalnızca saklı yordam tarafından yapılan değişiklikleri geri almak için işlem kayıt noktasının nasıl kullanılacağı gösterilmektedir.

USE AdventureWorks2022;  
GO  
IF EXISTS (SELECT name FROM sys.objects  
           WHERE name = N'SaveTranExample')  
    DROP PROCEDURE SaveTranExample;  
GO  
CREATE PROCEDURE SaveTranExample  
    @InputCandidateID INT  
AS  
    -- Detect whether the procedure was called  
    -- from an active transaction and save  
    -- that for later use.  
    -- In the procedure, @TranCounter = 0  
    -- means there was no active transaction  
    -- and the procedure started one.  
    -- @TranCounter > 0 means an active  
    -- transaction was started before the   
    -- procedure was called.  
    DECLARE @TranCounter INT;  
    SET @TranCounter = @@TRANCOUNT;  
    IF @TranCounter > 0  
        -- Procedure called when there is  
        -- an active transaction.  
        -- Create a savepoint to be able  
        -- to roll back only the work done  
        -- in the procedure if there is an  
        -- error.  
        SAVE TRANSACTION ProcedureSave;  
    ELSE  
        -- Procedure must start its own  
        -- transaction.  
        BEGIN TRANSACTION;  
    -- Modify database.  
    BEGIN TRY  
        DELETE HumanResources.JobCandidate  
            WHERE JobCandidateID = @InputCandidateID;  
        -- Get here if no errors; must commit  
        -- any transaction started in the  
        -- procedure, but not commit a transaction  
        -- started before the transaction was called.  
        IF @TranCounter = 0  
            -- @TranCounter = 0 means no transaction was  
            -- started before the procedure was called.  
            -- The procedure must commit the transaction  
            -- it started.  
            COMMIT TRANSACTION;  
    END TRY  
    BEGIN CATCH  
        -- An error occurred; must determine  
        -- which type of rollback will roll  
        -- back only the work done in the  
        -- procedure.  
        IF @TranCounter = 0  
            -- Transaction started in procedure.  
            -- Roll back complete transaction.  
            ROLLBACK TRANSACTION;  
        ELSE  
            -- Transaction started before procedure  
            -- called, do not roll back modifications  
            -- made before the procedure was called.  
            IF XACT_STATE() <> -1  
                -- If the transaction is still valid, just  
                -- roll back to the savepoint set at the  
                -- start of the stored procedure.  
                ROLLBACK TRANSACTION ProcedureSave;  
                -- If the transaction is uncommitable, a  
                -- rollback to the savepoint is not allowed  
                -- because the savepoint rollback writes to  
                -- the log. Just return to the caller, which  
                -- should roll back the outer transaction.  
  
        -- After the appropriate rollback, echo error  
        -- information to the caller.  
        DECLARE @ErrorMessage NVARCHAR(4000);  
        DECLARE @ErrorSeverity INT;  
        DECLARE @ErrorState INT;  
  
        SELECT @ErrorMessage = ERROR_MESSAGE();  
        SELECT @ErrorSeverity = ERROR_SEVERITY();  
        SELECT @ErrorState = ERROR_STATE();  
  
        RAISERROR (@ErrorMessage, -- Message text.  
                   @ErrorSeverity, -- Severity.  
                   @ErrorState -- State.  
                   );  
    END CATCH  
GO  

Ayrıca Bkz.

BAŞLAYIN (Transact-SQL)
İŞLEME İŞLEMI (Transact-SQL)
IŞ BAĞLI (Transact-SQL)
ERROR_LINE (Transact-SQL)
ERROR_MESSAGE (Transact-SQL)
ERROR_NUMBER (Transact-SQL)
ERROR_PROCEDURE (Transact-SQL)
ERROR_SEVERITY (Transact-SQL)
HATA_DURUMU (Transact-SQL)
RAISERROR (Transact-SQL)
GERI ALMA İŞLEMI (Transact-SQL)
GERI ALMA ÇALıŞMASı (Transact-SQL)
DENEYIN... CATCH (Transact-SQL)
XACT_STATE (Transact-SQL)