xact_state (Transact-sql)

Geçerli çalışan istek kullanıcı hareket durumu raporları skalar bir işlevdir. xact_state isteği etkin kullanıcı hareket olup olmadığı ve hareket kaydedilmiş yetenekli olup gösterir.

Konu bağlantısı simgesi Transact-SQL Sözdizim Kuralları

Sözdizimi

XACT_STATE()

Dönüş Türü

smallint

Açıklamalar

xact_state aşağıdaki değerleri döndürür.

Dönüş değeri

Anlamı

1

Geçerli isteğin etkin kullanıcı hareket vardır. İstek veri yazma ve işlem yapılıyor gibi tüm eylemleri gerçekleştirebilir.

0

Geçerli isteğin hiçbir etkin kullanıcı hareket yoktur.

-1

Geçerli isteğin etkin kullanıcı hareket vardır, ama hareket uncommittable bir hareket olarak sınıflandırılmış neden bir hata oluştu. İstek hareketi tamamlamak veya bir kayıt noktası için geri olamaz; yalnızca hareketin tam bir geri alma isteğinde bulunabilirsiniz. Geri hareket alır kadar isteği herhangi bir yazma işlemi yapamazsınız. Geri hareket alır kadar isteği yalnızca okuma işlemleri gerçekleştirebilirsiniz. Hareket geri alındıktan sonra istek, hem de gerçekleştirebilir okuma ve yazma işlemleri ve yeni bir hareket başlayabilir.

Toplu çalışması bittiğinde Veritabanı Altyapısıotomatik olarak aktif uncommittable hareketleri geri döner. Toplu işlem tamamlandığında, hareket bir uncommittable durumuna girildiğinde hata ileti gönderilmedi, hata iletisi istemci uygulamasına gönderilir. Bu ileti, bir uncommittable hareket algıladı ve geri gösterir.

@@ trancount ve xact_state işlevleri geçerli isteğin etkin kullanıcı hareket sahip olup olmadığını algılamak için kullanılabilir. @@ trancount, bu hareket uncommittable bir hareket olarak sınıflandırılmış olup olmadığını belirlemek için kullanılamaz. xact_state, iç içe geçmiş hareketler olup olmadığını belirlemek için kullanılamaz.

Örnekler

Aşağıdaki örnek XACT_STATEde CATCHblok, bir TRY…CATCHtamamlanmaya veya bir hareketi geri belirlemek için inşa etmek. Çünkü SET XACT_ABORTolan ON, bir uncommittable durumuna girmek hareket kısıtlaması ihlali hatası neden.

USE AdventureWorks2012;
GO

-- SET XACT_ABORT ON will render the transaction uncommittable
-- when the constraint violation occurs.
SET XACT_ABORT ON;

BEGIN TRY
    BEGIN TRANSACTION;
        -- A FOREIGN KEY constraint exists on this table. This 
        -- statement will generate a constraint violation error.
        DELETE FROM Production.Product
            WHERE ProductID = 980;

    -- If the delete operation succeeds, commit the transaction. The CATCH
    -- block will not execute.
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    -- Test XACT_STATE for 0, 1, or -1.
    -- If 1, the transaction is committable.
    -- If -1, the transaction is uncommittable and should 
    --     be rolled back.
    -- XACT_STATE = 0 means there is no transaction and
    --     a commit or rollback operation would generate an error.

    -- Test whether the transaction is uncommittable.
    IF (XACT_STATE()) = -1
    BEGIN
        PRINT 'The transaction is in an uncommittable state.' +
              ' Rolling back transaction.'
        ROLLBACK TRANSACTION;
    END;

    -- Test whether the transaction is active and valid.
    IF (XACT_STATE()) = 1
    BEGIN
        PRINT 'The transaction is committable.' + 
              ' Committing transaction.'
        COMMIT TRANSACTION;   
    END;
END CATCH;
GO

USE AdventureWorks2012;
GO

-- SET XACT_ABORT ON will render the transaction uncommittable
-- when the constraint violation occurs.
SET XACT_ABORT ON;

BEGIN TRY
    BEGIN TRANSACTION;
        -- A FOREIGN KEY constraint exists on this table. This 
        -- statement will generate a constraint violation error.
        DELETE FROM Production.Product
            WHERE ProductID = 980;

    -- If the delete operation succeeds, commit the transaction. The CATCH
    -- block will not execute.
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    -- Test XACT_STATE for 0, 1, or -1.
    -- If 1, the transaction is committable.
    -- If -1, the transaction is uncommittable and should 
    --     be rolled back.
    -- XACT_STATE = 0 means there is no transaction and
    --     a commit or rollback operation would generate an error.

    -- Test whether the transaction is uncommittable.
    IF (XACT_STATE()) = -1
    BEGIN
        PRINT 'The transaction is in an uncommittable state.' +
              ' Rolling back transaction.'
        ROLLBACK TRANSACTION;
    END;

    -- Test whether the transaction is active and valid.
    IF (XACT_STATE()) = 1
    BEGIN
        PRINT 'The transaction is committable.' + 
              ' Committing transaction.'
        COMMIT TRANSACTION;   
    END;
END CATCH;
GO

Ayrıca bkz.

Başvuru

@@ trancount (Transact-sql)

BEGIN TRANSACTION (Transact-SQL)

TAMAMLAMA hareket (Transact-sql)

rollback TRANSACTION (Transact-sql)

HAREKET (Transact-sql) Kaydet

DENEYİN...catch (Transact-sql)