Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Magazijn in Microsoft Fabric
SQL-database in Microsoft Fabric
Markeert het beginpunt van een expliciete, lokale transactie. Expliciete transacties beginnen met de BEGIN TRANSACTION instructie en eindigen met de COMMIT of-instructie ROLLBACK .
Transact-SQL syntaxis-conventies
Syntax
Syntaxis voor SQL Server, Azure SQL Database, Azure SQL Managed Instance, SQL-database in Microsoft Fabric.
BEGIN { TRAN | TRANSACTION }
[ { transaction_name | @tran_name_variable }
[ WITH MARK [ 'description' ] ]
]
[ ; ]
Syntaxis voor Fabric Data Warehouse, Azure Synapse Analytics en Analytics Platform System (PDW).
BEGIN { TRAN | TRANSACTION }
[ ; ]
Arguments
transaction_name
Van toepassing op: SQL Server 2008 (10.0.x) en latere versies, Azure SQL Database, Azure SQL Managed Instance, SQL-database in Microsoft Fabric.
De naam die is toegewezen aan de transactie.
transaction_name moet voldoen aan de regels voor id's, maar id's die langer zijn dan 32 tekens zijn niet toegestaan. Gebruik alleen transactienamen voor het buitenste paar of BEGIN...ROLLBACK de buitenste instructiesBEGIN...COMMIT.
transaction_name is altijd hoofdlettergevoelig, zelfs als het database-engine-exemplaar niet hoofdlettergevoelig is.
@tran_name_variable
Van toepassing op: SQL Server 2008 (10.0.x) en latere versies, Azure SQL Database, Azure SQL Managed Instance, SQL-database in Microsoft Fabric.
De naam van een door de gebruiker gedefinieerde variabele met een geldige transactienaam. De variabele moet worden gedeclareerd met een gegevenstype char, varchar, nchar of nvarchar . Als er meer dan 32 tekens worden doorgegeven aan de variabele, worden alleen de eerste 32 tekens gebruikt. De resterende tekens worden afgekapt.
MET MARK [ 'beschrijving' ]
Van toepassing op: SQL Server 2008 (10.0.x) en latere versies, Azure SQL Database, Azure SQL Managed Instance, SQL-database in Microsoft Fabric.
Hiermee geeft u op dat de transactie is gemarkeerd in het transactielogboek.
beschrijving is een tekenreeks die de markering beschrijft. Een beschrijving van meer dan 128 tekens wordt afgekapt tot 128 tekens voordat deze in de msdb.dbo.logmarkhistory tabel wordt opgeslagen.
Als WITH MARK deze wordt gebruikt, moet een transactienaam worden opgegeven.
WITH MARK maakt het mogelijk om een transactielogboek te herstellen naar een punt dat wordt geïdentificeerd door de markering.
Remarks
BEGIN TRANSACTION incrementen @@TRANCOUNT met 1.
BEGIN TRANSACTION vertegenwoordigt een punt waarop de gegevens waarnaar wordt verwezen door een sessie een bepaalde consistentiestatus hebben. Alle gegevenswijzigingen die zijn aangebracht nadat de BEGIN TRANSACTION gegevens kunnen worden teruggedraaid om de gegevens te retourneren naar deze bekende consistentiestatus. Elke transactie duurt totdat COMMIT TRANSACTION deze wordt uitgegeven om de wijzigingen een permanent deel van de database aan te brengen, of alle wijzigingen worden gewist met een ROLLBACK TRANSACTION instructie.
Een transactie kan automatisch worden teruggedraaid als er een transactie afgebroken fout optreedt of als er een runtimefout optreedt en de XACT_ABORT sessieoptie is ingesteld op ON. Zie SET XACT_ABORT voor meer informatie.
BEGIN TRANSACTION start een lokale transactie voor de sessie die de instructie uitgeeft. Afhankelijk van de huidige instellingen voor transactieisolatieniveau, worden resources die zijn verkregen ter ondersteuning van de Transact-SQL-instructies die door de sessie zijn uitgegeven, door de transactie vergrendeld totdat deze is voltooid met een COMMIT TRANSACTION of ROLLBACK TRANSACTION meer instructies. Transacties die gedurende lange tijd openstaand blijven, kunnen voorkomen dat andere sessies toegang hebben tot deze vergrendelde resources en kunnen ook voorkomen dat transactielogboeken worden afgekapt en het opschonen van versieopslag.
Hoewel BEGIN TRANSACTION een lokale transactie wordt gestart, wordt deze pas vastgelegd in het transactielogboek als de toepassing vervolgens een actie uitvoert die moet worden vastgelegd in het logboek, zoals het uitvoeren van een INSERT, UPDATEof DELETE instructie. Zodra een transactie is gestart, kan de database-engine acties uitvoeren, zoals het verkrijgen van vergrendelingen om het niveau van transactieisolatie van SELECT instructies te beveiligen, maar er wordt niets vastgelegd in het transactielogboek totdat de toepassing een wijzigingsactie uitvoert.
Na het uitgeven kunt u opnieuw een BEGIN TRANSACTION probleem afhandelen BEGIN TRANSACTIONom een of meer binnenste transacties te starten. Hoewel u transaction_name voor een interne transactie kunt opgeven, wordt alleen de eerste (buitenste) transactienaam geregistreerd bij het systeem. Een terugdraaiactie naar een andere naam (behalve een geldige savepoint-naam) genereert een fout zonder een van de instructies terug te draaien. De instructies worden alleen teruggedraaid wanneer de buitenste transactie wordt teruggedraaid.
De lokale transactie die door de BEGIN TRANSACTION instructie is gestart, wordt gepromoveerd naar een gedistribueerde transactie als de volgende acties worden uitgevoerd voordat de instructie wordt doorgevoerd of teruggedraaid:
Een
INSERT,DELETEofUPDATEinstructie die verwijst naar een externe tabel op een gekoppelde server, wordt uitgevoerd. DeINSERTinstructie ,UPDATEofDELETEinstructie mislukt als de OLE DB-provider die wordt gebruikt voor toegang tot de gekoppelde server, de interface niet ondersteuntITransactionJoin.Er wordt een aanroep uitgevoerd naar een externe opgeslagen procedure wanneer de
REMOTE_PROC_TRANSACTIONSoptie is ingesteld opON.
Het lokale Database Engine-exemplaar wordt de transactiecontroller en gebruikt Microsoft Distributed Transaction Coordinator (MS DTC) om de gedistribueerde transactie te beheren.
Een transactie kan expliciet worden uitgevoerd als een gedistribueerde transactie met behulp van BEGIN DISTRIBUTED TRANSACTION. Zie BEGIN DISTRIBUTED TRANSACTION voor meer informatie.
Wanneer SET IMPLICIT_TRANSACTIONS deze optie is ingesteld ON, wordt met een BEGIN TRANSACTION instructie een buitenste en een interne transactie gemaakt, ingesteld op @@TRANCOUNT 2. Zie SET IMPLICIT_TRANSACTIONS voor meer informatie.
Opmerking
De database-engine biedt geen ondersteuning voor onafhankelijk beheerbare geneste transacties. Een doorvoer van een interne transactie wordt afgenomen @@TRANCOUNT , maar heeft geen andere effecten. Een terugdraaibewerking van een interne transactie rolt altijd de buitenste transactie terug, tenzij er een savepoint bestaat en wordt opgegeven in de ROLLBACK instructie.
Gemarkeerde transacties
De WITH MARK optie zorgt ervoor dat de transactienaam wordt vastgelegd in het transactielogboek. Wanneer u een database herstelt naar een eerdere status, kan de gemarkeerde transactie worden gebruikt om het herstelpunt op te geven in plaats van een datum en tijd. Zie Gemarkeerde transacties gebruiken om gerelateerde databases consistent enRESTORE-instructies te herstellen voor meer informatie.
Daarnaast zijn transactielogboekmarkeringen nodig als u een set gerelateerde databases wilt herstellen naar een bepaalde gedeelde consistentiestatus. Een toepassing die zich bewust is van de consistentiestatus van elke database kan markeringen in de transactielogboeken van de gerelateerde databases plaatsen met behulp van een cross-database of een gedistribueerde transactie. Het herstellen van de set gerelateerde databases op deze markeringen resulteert in een set databases met een bekende gedeelde consistentiestatus.
De markering wordt alleen in het transactielogboek geplaatst als de database wordt bijgewerkt door de gemarkeerde transactie. Transacties die geen gegevens wijzigen, worden niet vastgelegd in het logboek.
BEGIN TRANSACTION <new_name> WITH MARK kan worden gebruikt bij het starten van een interne transactie. In dat geval <new_name> wordt dit de marknaam voor de transactie als de buitenste transactie niet is gemarkeerd. In het volgende conceptuele voorbeeld M2 is dit de naam van het teken.
BEGIN TRAN T1;
UPDATE table1 ...;
BEGIN TRAN M2 WITH MARK;
UPDATE table2 ...;
SELECT column1 FROM table1;
COMMIT TRAN M2;
UPDATE table3 ...;
COMMIT TRAN T1;
Wanneer u een interne transactie markeert, ontvangt u het volgende waarschuwingsbericht als u een transactie probeert te markeren die al is gemarkeerd:
Server: Msg 3920, Level 16, State 1, Line 3
WITH MARK option only applies to the first BEGIN TRAN WITH MARK.
The option is ignored.
Permissions
Vereist lidmaatschap van de public rol.
Examples
De codevoorbeelden in dit artikel gebruiken de AdventureWorks2025 of AdventureWorksDW2025 voorbeelddatabase die u kunt downloaden van de startpagina van Microsoft SQL Server Samples en Community Projects .
A. Een expliciete transactie gebruiken
Van toepassing op: SQL Server 2008 (10.0.x) en latere versies, Azure SQL Database, Azure SQL Managed Instance, SQL-database in Microsoft Fabric, Azure Synapse Analytics, Analytics Platform System (PDW)
BEGIN TRANSACTION;
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT TRANSACTION;
B. Een transactie terugdraaien
Van toepassing op: SQL Server 2008 (10.0.x) en latere versies, Azure SQL Database, Azure SQL Managed Instance, SQL-database in Microsoft Fabric, Azure Synapse Analytics, Analytics Platform System (PDW)
In het volgende voorbeeld ziet u het effect van het terugdraaien van een transactie. In dit voorbeeld wordt de ROLLBACK instructie teruggedraaid INSERT , maar de gemaakte tabel bestaat nog steeds.
CREATE TABLE ValueTable
(
id INT
);
BEGIN TRANSACTION;
INSERT INTO ValueTable VALUES (1);
INSERT INTO ValueTable VALUES (2);
ROLLBACK;
C. Een transactie een naam opgeven
Van toepassing op: SQL Server 2008 (10.0.x) en latere versies, Azure SQL Database, Azure SQL Managed Instance, SQL-database in Microsoft Fabric
In het volgende voorbeeld ziet u hoe u een transactie een naam geeft.
DECLARE @TranName AS VARCHAR (20);
SELECT @TranName = 'MyTransaction';
BEGIN TRANSACTION @TranName;
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT TRANSACTION @TranName;
D. Een transactie markeren
Van toepassing op: SQL Server 2008 (10.0.x) en latere versies, Azure SQL Database, Azure SQL Managed Instance, SQL-database in Microsoft Fabric
In het volgende voorbeeld ziet u hoe u een transactie markeert. De transactie CandidateDelete is gemarkeerd.
BEGIN TRANSACTION CandidateDelete
WITH MARK N'Deleting a Job Candidate';
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT TRANSACTION CandidateDelete;