Megosztás a következőn keresztül:


XACT_STATE (Transact-SQL)

Vonatkozik a következőkre:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalitikai Platform System (PDW)SQL adatbázis a Microsoft Fabric-ben

Egy skaláris függvény, amely a jelenleg futó kérés felhasználói tranzakciós állapotát jelenti. XACT_STATE jelzi, hogy a kérésnek van-e aktív felhasználói tranzakciója, és hogy a tranzakció elkötelezhető-e.

Transact-SQL szintaxis konvenciók

Szemantika

XACT_STATE()  

Megjegyzés:

Ezt a szintaxist az Azure Synapse Analytics kiszolgáló nélküli SQL-készlete nem támogatja.

Visszatérési típus

smallint

Megjegyzések

XACT_STATE a következő értékeket adja vissza.

Visszaadott érték Meaning
1 A jelenlegi kérésnek aktív felhasználói tranzakciója van. A kérés bármilyen műveletet végrehajthat, beleértve az adatírást és a tranzakció elkötését is.
0 Nincs aktív felhasználói tranzakció a jelenlegi kéréshez.
-1 A jelenlegi kérésnek aktív felhasználói tranzakciója van, de egy hiba történt, amely miatt a tranzakciót nem kötelezhető tranzakcióként sorolták be. A kérés nem tudja felvállalni a tranzakciót vagy vissza vissza mentési pontra; Csak a tranzakció teljes visszavonását kérheti. A kérés nem végezhet írási műveleteket, amíg vissza nem indítja a tranzakciót. A kérés csak olvasási műveleteket végezhet, amíg vissza nem fordítja a tranzakciót. Miután a tranzakciót visszafordították, a kérés mind olvasási, mind írási műveleteket végezhet, és új tranzakciót indíthat.

Amikor a legkülső batch befejezi a futtatást, az Adatbázis Engine automatikusan visszafordítja az aktív, elkötelezett tranzakciókat. Ha a tranzakció elkötelezettségtelen állapotba került és nem küldött hibaüzenetet, akkor a batch befejezésekor hibaüzenetet küldenek az ügyfélalkalmazásnak. Ez az üzenet azt jelzi, hogy egy elkötelezetlen tranzakciót észleltek és visszaállítottak.

Mind a XACT_STATE, mind a @@TRANCOUNT funkció használható annak felismerésére, hogy a jelenlegi kérésnek van-e aktív felhasználói tranzakciója. @@TRANCOUNT nem használható annak megállapítására, hogy az adott tranzakció elkötelezetlen tranzakcióként lett-e besorolva. XACT_STATE nem használható arra, hogy megállapítsák, vannak-e beágyazott tranzakciók.

Példák

A következő példa XACT_STATE egy CATCH konstrukció blokkjában TRY...CATCH határozza meg, hogy elkötelezzük-e vagy visszafordítsunk egy tranzakciót. Mivel SET XACT_ABORT az ON, a korlátozás megsértési hiba miatt a tranzakció elkötelezetlen állapotba kerül.

USE AdventureWorks2022;  
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  

Lásd még:

@@TRANCOUNT (Transact-SQL)
TRANZAKCIÓ INDÍTÁSA (Transact-SQL)
VÉGLEGESÍTÉSI TRANZAKCIÓ (Transact-SQL)
VISSZAÁLLÍTÁSI TRANZAKCIÓ (Transact-SQL)
MENTÉS TRANZAKCIÓ (Transact-SQL)
TRY... CATCH (Transact-SQL)