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


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. ROLLBACK TRANSACTION A tranzakció kezdetétől vagy a mentési pontig végrehajtott összes adatmódosítást törölheti. Emellett felszabadítja a tranzakció által birtokolt erőforrásokat is.

A tranzakciók visszaállítása nem tartalmazza a helyi változók vagy táblaváltozók módosításait. Ezeket a módosításokat ez az utasítás nem törli.

Transact-SQL szintaxis konvenciók

Syntax

Az SQL Server, az Azure SQL Database és a Fabric SQL Database szintaxisa.

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 tranzakcióhoz hozzárendelt név a következőn 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. Tranzakciók beágyazásakor 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 SQL Server-példány nem megkülönbözteti a kis- és nagybetűk megkülönböztetésének eseteit.

@tran_name_variable

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 feltételes visszaállításnak csak a tranzakció egy részét kell érintenie.

@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. RAISERROR a hibák jelzésére szolgáló elsődleges utasítás.

Remarks

ROLLBACK TRANSACTION savepoint_name vagy transaction_name nélkül visszatér a tranzakció elejére. A tranzakciók beágyazásakor ugyanez az utasítás az összes belső tranzakciót visszahelyezi a legkülső BEGIN TRANSACTION utasításba. 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 explicit módon indított vagy eszkalált elosztott tranzakciókban.

A tranzakció nem állítható vissza egy COMMIT TRANSACTION utasítás végrehajtása után, kivéve, ha a COMMIT TRANSACTION tranzakció egy beágyazott tranzakcióhoz van társítva, amely a visszaállítandó tranzakcióban található. Ebben az esetben a beágyazott tranzakció vissza lesz állítva, még akkor is, ha kiadta COMMIT TRANSACTION a tranzakciót.

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.

Interoperability

Tárolt eljárásokban a ROLLBACK TRANSACTIONsavepoint_name vagy transaction_name nélküli utasítások minden utasítást visszatekernek a legkülsőre BEGIN TRANSACTION. Egy ROLLBACK TRANSACTION tárolt eljárásban lévő utasítás, amely a tárolt eljárás befejeződésekor más értéket eredményez @@TRANCOUNT , mint a @@TRANCOUNT tárolt eljárás meghívásának értéke, tájékoztató üzenetet hoz létre. 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 vélelmezett beágyazott tranzakcióként kezeli az eseményindítót.)

ROLLBACK TRANSACTION a tárolt eljárásokban lévő utasítások nem befolyásolják az eljárást meghívó köteg későbbi utasításait; a kötegben lévő további utasítások végrehajtása. ROLLBACK TRANSACTION az eseményindítókban lévő utasítások megszakítják 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 az alábbi három szabály határozza meg:

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

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

  • Egy köteg leállítását és belső visszaállítási felszabadítást generáló hiba a hibakimutatást tartalmazó kötegben deklarált összes kurzort felszabadítja. 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 hibaköteg által meghívott tárolt eljárásokban deklarált kurzorok. A hibaköteg előtt egy kötegben deklarált kurzorokra az első két szabály vonatkozik. A holtpont típusú hiba egy példa erre a hibatípusra. Az ROLLBACK eseményindítóban kiadott utasítás is automatikusan létrehozza ezt a típusú hibát.

Zárolási viselkedés

A ROLLBACK TRANSACTIONsavepoint_name megadásával a savepointon kívül beszerzett zárolások feloldhatók, kivéve az eszkalációkat és átalakításokat. Ezek a zárolások nem szabadulnak fel, és nem lesznek visszaalakítva az előző zárolási módjukra.

Permissions

A nyilvános szerepkör tagságát igényli.

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;
GO

CREATE TABLE ValueTable ([value] INT);
GO

DECLARE @TransactionName 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