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. veritabanı altyapısı ö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

Bir işlem içinde bir kayıt noktası ayarlayabilirsiniz. Kayıt noktası, işlemin bir bölümü koşullu olarak iptal edilirse işlemin döndürebileceği tutarlılık durumunu tanımlar. Bir işlem bir kayıt noktasına geri alınırsa, gerekirse daha fazla Transact-SQL deyimiyle ve bir COMMIT TRANSACTION deyimle tamamlanmaya devam etmelidir veya işlemi yeniden başlangıcına döndürerek tamamen iptal edilmelidir. İşlemin tamamını iptal etmek için formunu ROLLBACK TRANSACTION transaction_namekullanı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 bir ROLLBACK TRANSACTION deyim yalnızca bu adı kullanarak işlemi en son SAVE TRANSACTION kullanılana geri alır.

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

Uyarı

Veritabanı Altyapısı bağımsız olarak yönetilebilir iç içe işlemleri desteklemez. İç işlem işlemesi azalsa @@TRANCOUNT da başka etkisi yoktur. İç işlemin geri alınması, bir kayıt noktası olmadığı ve deyiminde ROLLBACK belirtilmediği sürece her zaman dış işlemi geri alır.

Kilitleme davranışı

ROLLBACK TRANSACTION savepoint_name belirten bir deyim, yükseltilen ve dönüştürülen kilitler 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ülemez.

Permissions

Rolde public üyelik gerektirir.

Examples

Bu makaledeki kod örnekleri, AdventureWorks2025 giriş sayfasından indirebileceğiniz AdventureWorksDW2025 veya örnek veritabanını kullanır.

Aşağıdaki örnekte, saklı yordam yürütülmeden önce 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.

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, return 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