Megosztás:


VISSZAÁLLÍTÁSI TRANZAKCIÓ (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példányAzure Synapse AnalyticsElemzési platformrendszer (PDW)Raktár a Microsoft FabricbenSQL-adatbázis a Microsoft Fabricben

Ez az utasítás visszaállít egy explicit vagy implicit tranzakciót a tranzakció elejére vagy a tranzakción belüli savepointra. A tranzakció kezdetétől vagy egy mentési ponttól végrehajtott összes adatmódosítás törlésére használható ROLLBACK TRANSACTION . ROLLBACK TRANSACTION felszabadítja a tranzakció által birtokolt erőforrásokat is.

A helyi változók vagy táblaváltozók módosításait ez az utasítás nem törli.

Transact-SQL szintaxis konvenciók

Syntax

Szintaxis az SQL Serverhez, az Azure SQL Database-hez, a felügyelt Azure SQL-példányhoz és a Microsoft Fabric SQL-adatbázishoz.

ROLLBACK { TRAN | TRANSACTION }
    [ transaction_name | @tran_name_variable
    | savepoint_name | @savepoint_variable ]
[ ; ]

A Fabric Data Warehouse, az Azure Synapse Analytics és a párhuzamos adattárház-adatbázis szintaxisa.

ROLLBACK { TRAN | TRANSACTION }
[ ; ]

Arguments

transaction_name

A következőkre vonatkozik: SQL Server 2008 (10.0.x) és újabb verziók, Azure SQL Database, Felügyelt Azure SQL-példány, SQL Database a Microsoft Fabricben.

A tranzakcióhoz hozzárendelt név a következővel BEGIN TRANSACTION: . transaction_name meg kell felelnie az azonosítókra vonatkozó szabályoknak, de csak a tranzakció nevének első 32 karakterét használja a rendszer. Belső tranzakciók esetén transaction_name a legkülső BEGIN TRANSACTION utasításból származó névnek kell lennie. transaction_name mindig megkülönbözteti a kis- és nagybetűk megkülönböztetése, még akkor is, ha az adatbázismotor-példány nem érzékeny a kis- és nagybetűkre.

@tran_name_variable

A következőkre vonatkozik: SQL Server 2008 (10.0.x) és újabb verziók, Azure SQL Database, Felügyelt Azure SQL-példány, SQL Database a Microsoft Fabricben.

Egy felhasználó által definiált változó neve, amely érvényes tranzakciónevet tartalmaz. A változót karakter, varchar, nchar vagy nvarchar adattípussal kell deklarálni.

savepoint_name

savepoint_name egy SAVE TRANSACTION nyilatkozatból. savepoint_name meg kell felelniük az azonosítókra vonatkozó szabályoknak. Használja savepoint_name , ha a visszaállítás csak a tranzakciónak a mentési pont utáni részét érinti.

@savepoint_variable

Egy felhasználó által definiált változó neve, amely érvényes savepoint-nevet tartalmaz. A változót karakter, varchar, nchar vagy nvarchar adattípussal kell deklarálni.

Hibakezelés

Az ROLLBACK TRANSACTION utasítások nem hoznak létre üzeneteket a felhasználónak. Ha a tárolt eljárásokban vagy eseményindítókban figyelmeztetésekre van szükség, használja az vagy RAISERROR az PRINT utasításokat.

Remarks

ROLLBACK TRANSACTION savepoint_name vagy transaction_name nélkül visszatér a tranzakció elejére. Ha vannak belső tranzakciók, ez az utasítás az összes belső tranzakciót visszaállítja a legkülső BEGIN TRANSACTION utasításra. Mindkét esetben ROLLBACK TRANSACTION a @@TRANCOUNT rendszerfüggvény 0-ra csökken. ROLLBACK TRANSACTION savepoint_name nem csökken @@TRANCOUNT.

ROLLBACK TRANSACTION nem hivatkozhat savepoint_name a helyi tranzakcióval BEGIN DISTRIBUTED TRANSACTION kifejezetten elindított vagy előléptetett elosztott tranzakciókban.

A tranzakciók nem állíthatók vissza egy COMMIT TRANSACTION utasítás végrehajtása után, kivéve, ha a COMMIT TRANSACTION tranzakció egy belső tranzakcióhoz van társítva, amely a visszagördített tranzakcióban található. Ebben az esetben a belső tranzakció vissza lesz állítva, még akkor is, ha kiadta COMMIT TRANSACTION a számára.

Egy tranzakción belül a savepoint-nevek duplikálása engedélyezett, de ROLLBACK TRANSACTION a duplikált savepoint-név használata csak a legutóbbira SAVE TRANSACTION kerül vissza ezzel a savepoint-névvel.

Megjegyzés:

Az adatbázismotor nem támogatja az egymástól függetlenül kezelhető beágyazott tranzakciókat. Belső tranzakciós decrements @@TRANCOUNT véglegesítés, de nincs más hatása. A belső tranzakciók visszaállítása mindig visszaállítja a külső tranzakciót, kivéve, ha létezik mentési pont , és az ROLLBACK utasításban meg van adva.

Interoperability

A tárolt eljárásokban egy ROLLBACK TRANSACTIONsavepoint_name vagy transaction_name nélküli utasítás az összes utasítást visszaállítja a legkülsőre BEGIN TRANSACTION. Egy ROLLBACK TRANSACTION tárolt eljárás azon utasítása, amely az eljárás befejezésekor eltérő értéket eredményez @@TRANCOUNT , mint az eljárás kezdetének értéke, tájékoztató üzenetet eredményez. Ez az üzenet nem befolyásolja a későbbi feldolgozást.

Ha egy eseményindítóban ad ki egy ROLLBACK TRANSACTION eseményindítót:

  • Az aktuális tranzakció ezen pontjának összes adatmódosítása vissza lesz állítva, beleértve az eseményindító által végrehajtott módosításokat is.

  • Az eseményindító az utasítás után is végrehajtja a ROLLBACK fennmaradó utasításokat. Ha ezen utasítások bármelyike módosítja az adatokat, a módosítások nem lesznek visszaállítva. A fennmaradó utasítások végrehajtása nem aktiválja a beágyazott eseményindítókat.

  • A kötegben az eseményindítót aktiváló utasítás utáni utasítások nem lesznek végrehajtva.

@@TRANCOUNT egy eseményindító beírásakor egyenként növekszik, még akkor is, ha autocommit módban van. A rendszer egy eseményindítót hallgatólagos belső tranzakcióként kezel.

A ROLLBACK TRANSACTION tárolt eljárásban lévő utasítások nem befolyásolják az eljárást meghívó köteg későbbi utasításait. A rendszer végrehajtja a köteg későbbi utasításait.

Az ROLLBACK TRANSACTION eseményindítóban lévő utasítás leállítja az eseményindítót aktiváló utasítást tartalmazó köteget. A köteg későbbi utasításai nem lesznek végrehajtva.

A kurzorokra gyakorolt hatást ROLLBACK a következő szabályok határozzák meg:

  • Ha CURSOR_CLOSE_ON_COMMIT be van ONállítva, bezárul, ROLLBACK de nem oldja fel az összes megnyitott kurzort.

  • A CURSOR_CLOSE_ON_COMMIT beállítás OFFROLLBACK értéke nem befolyásolja a nyitott szinkronSTATIC, INSENSITIVE illetve a kurzorokat vagy aszinkron STATIC kurzorokat, amelyek teljesen fel vannak töltve. Bármely más típusú megnyitott kurzor bezárva van, de nincs felszabadítva.

  • Egy olyan hiba, amely leállítja a köteget, és visszaállítja a tranzakció felszabadítását, a hibát létrehozó utasítást tartalmazó kötegben deklarált összes kurzort áthelyezi. A kurzorok a típusuktól és a beállításuktól CURSOR_CLOSE_ON_COMMITfüggetlenül el vannak helyezve. Ide tartoznak a hibát létrehozó köteg által meghívott tárolt eljárásokban deklarált kurzorok. A hibát létrehozó kötegben deklarált kurzorokra az előző két szabály vonatkozik.

    A holtpont egy példa erre a hibatípusra. Egy ROLLBACK eseményindítóban kiadott utasítás is ezt a viselkedést eredményezi.

Zárolási viselkedés

A ROLLBACK TRANSACTIONsavepoint_name jelölő utasítás a savepointon kívül beszerzett összes zárolást felszabadítja, kivéve az eszkalált és konvertált zárolásokat. Ezek a zárolások nem szabadulnak fel, és nem lesznek visszaalakítva az előző zárolási módjukra.

Permissions

Tagságot igényel a public szerepkörben.

Examples

Az alábbi példa egy elnevezett tranzakció visszagördülésének hatását mutatja be. A tábla létrehozása után a következő utasítások elindítanak egy elnevezett tranzakciót, beszúrnak két sort, majd visszaállítják a változóban @TransactionNameelnevezett tranzakciót. A névvel ellátott tranzakción kívül egy másik utasítás két sort szúr be. A lekérdezés az előző utasítások eredményeit adja vissza.

USE tempdb;
CREATE TABLE ValueTable
(
    value INT
);

DECLARE @TransactionName AS VARCHAR (20) = 'Transaction1';

BEGIN TRANSACTION @TransactionName;

INSERT INTO ValueTable
VALUES (1), (2);

ROLLBACK TRANSACTION @TransactionName;

INSERT INTO ValueTable
VALUES (3), (4);

SELECT [value]
FROM ValueTable;

DROP TABLE ValueTable;

Itt van az eredmények összessége.

value
-----
3
4