Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de 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 Preview
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, Fabric SQL-database en Azure SQL Managed Instance.
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, Fabric SQL Database en Azure SQL Managed Instance
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 geneste BEGIN...COMMIT of BEGIN...ROLLBACK instructies.
transaction_name is altijd hoofdlettergevoelig, zelfs als het exemplaar van SQL Server niet hoofdlettergevoelig is.
@tran_name_variable
Van toepassing op: SQL Server 2008 (10.0.x) en latere versies, Azure SQL Database, Fabric SQL Database en Azure SQL Managed Instance
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.
WITH MARK [ 'description' ]
Van toepassing op: SQL Server 2008 (10.0.x) en latere versies, Azure SQL Database, Fabric SQL Database en Azure SQL Managed Instance
Hiermee geeft u op dat de transactie is gemarkeerd in het logboek.
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 benoemde markering.
Remarks
BEGIN TRANSACTION increments @@TRANCOUNT by 1.
BEGIN TRANSACTION vertegenwoordigt een punt waarop de gegevens waarnaar wordt verwezen door een verbinding logisch en fysiek consistent zijn. Als er fouten optreden, kunnen alle gegevenswijzigingen die zijn aangebracht nadat deze BEGIN TRANSACTION zijn teruggedraaid, worden teruggedraaid om de gegevens terug te sturen naar deze bekende consistentiestatus. Elke transactie duurt totdat deze is voltooid zonder fouten en COMMIT TRANSACTION wordt uitgegeven om de wijzigingen een permanent deel van de database aan te brengen, of fouten worden aangetroffen en alle wijzigingen worden gewist met een ROLLBACK TRANSACTION instructie.
BEGIN TRANSACTION start een lokale transactie voor de verbinding die de instructie uitgeeft. Afhankelijk van de huidige instellingen voor transactieisolatieniveau, worden veel resources die zijn verkregen ter ondersteuning van de Transact-SQL-instructies die zijn uitgegeven door de verbinding, vergrendeld door de transactie totdat deze is voltooid met een COMMIT TRANSACTION of ROLLBACK TRANSACTION meer instructies. Transacties die gedurende lange tijd openstaand blijven, kunnen voorkomen dat andere gebruikers toegang hebben tot deze vergrendelde resources en kunnen ook voorkomen dat logboeken worden afgekapt.
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. Een toepassing kan acties uitvoeren zoals het verkrijgen van vergrendelingen om het isolatieniveau van SELECT transacties te beveiligen, maar er wordt niets vastgelegd in het logboek totdat de toepassing een wijzigingsactie uitvoert.
Het benoemen van meerdere transacties in een reeks geneste transacties met een transactienaam heeft weinig effect op de transactie. Alleen de eerste (buitenste) transactienaam wordt geregistreerd bij het systeem. Een terugdraaiactie naar een andere naam (behalve een geldige savepoint-naam) genereert een fout. Geen van de instructies die worden uitgevoerd voordat het terugdraaien wordt teruggedraaid op het moment dat deze fout optreedt. De instructies worden alleen teruggedraaid wanneer de buitenste transactie wordt teruggedraaid.
De lokale transactie die door de BEGIN TRANSACTION instructie is gestart, wordt geëscaleerd 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.
De lokale kopie van SQL Server 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 dit is ingesteld ONop, worden met een BEGIN TRANSACTION instructie twee geneste transacties gemaakt. Zie SET IMPLICIT_TRANSACTIONS voor meer informatie.
Gemarkeerde transacties
De WITH MARK optie zorgt ervoor dat de transactienaam in het transactielogboek wordt geplaatst. Wanneer u een database herstelt naar een eerdere status, kan de gemarkeerde transactie worden gebruikt 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 logisch consistente status. Markeringen kunnen worden geplaatst in de transactielogboeken van de gerelateerde databases door een gedistribueerde transactie. Het herstellen van de set gerelateerde databases op deze markeringen resulteert in een set databases die transactioneel consistent zijn. Voor het plaatsen van markeringen in gerelateerde databases zijn speciale procedures vereist.
De markering wordt alleen in het transactielogboek geplaatst als de database wordt bijgewerkt door de gemarkeerde transactie. Transacties die geen gegevens wijzigen, worden niet gemarkeerd.
BEGIN TRANSACTION <new_name> WITH MARK kan worden genest binnen een al bestaande transactie die niet is gemarkeerd. Als u dit doet, <new_name> wordt de marknaam voor de transactie, ondanks de naam die de transactie mogelijk al heeft gekregen. In het volgende voorbeeld M2 is dit de naam van de markering.
BEGIN TRAN T1;
UPDATE table1 ...;
BEGIN TRAN M2 WITH MARK;
UPDATE table2 ...;
SELECT * from table1;
COMMIT TRAN M2;
UPDATE table3 ...;
COMMIT TRAN T1;
Wanneer u transacties nest, 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 openbare rol.
Examples
De codevoorbeelden in dit artikel gebruiken de AdventureWorks2022 of AdventureWorksDW2022 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, Fabric SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics, Analytics Platform System (PDW)
BEGIN TRANSACTION;
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT;
B. Een transactie terugdraaien
Van toepassing op: SQL Server 2008 (10.0.x) en latere versies, Azure SQL Database, Fabric SQL Database, Azure SQL Managed Instance, 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, Fabric SQL Database, Azure SQL Managed Instance
In het volgende voorbeeld ziet u hoe u een transactie een naam geeft.
DECLARE @TranName VARCHAR(20);
SELECT @TranName = 'MyTransaction';
BEGIN TRANSACTION @TranName;
USE AdventureWorks2022;
DELETE FROM AdventureWorks2022.HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT TRANSACTION @TranName;
GO
D. Een transactie markeren
Van toepassing op: SQL Server 2008 (10.0.x) en latere versies, Azure SQL Database, Fabric SQL Database, Azure SQL Managed Instance
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';
GO
USE AdventureWorks2022;
GO
DELETE FROM AdventureWorks2022.HumanResources.JobCandidate
WHERE JobCandidateID = 13;
GO
COMMIT TRANSACTION CandidateDelete;
GO