Sdílet prostřednictvím


ZAHÁJIT TRANSAKCI (Transact-SQL)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsPdW (Analytics Platform System)Sklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Označí výchozí bod explicitní místní transakce. Explicitní transakce začínají příkazem BEGIN TRANSACTION a končí příkazem COMMIT nebo ROLLBACK příkazem.

Transact-SQL konvence syntaxe

Syntax

Syntaxe pro SQL Server, Azure SQL Database, Databázi Fabric SQL a spravovanou instanci Azure SQL.

BEGIN { TRAN | TRANSACTION }
    [ { transaction_name | @tran_name_variable }
      [ WITH MARK [ 'description' ] ]
    ]
[ ; ]

Syntaxe pro datový sklad Fabric, Azure Synapse Analytics a systém platformy Analytics (PDW).

BEGIN { TRAN | TRANSACTION }
[ ; ]

Arguments

transaction_name

Platí pro: SQL Server 2008 (10.0.x) a novější verze, Azure SQL Database, Databáze Fabric a Azure SQL Managed Instance

Název přiřazený transakci. transaction_name musí odpovídat pravidlům identifikátorů, ale identifikátory delší než 32 znaků nejsou povolené. Názvy transakcí používejte pouze na nejkrajnější dvojici vnořených BEGIN...COMMIT příkazů nebo BEGIN...ROLLBACK příkazů. transaction_name se vždy rozlišují malá a velká písmena, i když instance SQL Serveru nerozlišuje malá a velká písmena.

@tran_name_variable

Platí pro: SQL Server 2008 (10.0.x) a novější verze, Azure SQL Database, Databáze Fabric a Azure SQL Managed Instance

Název uživatelem definované proměnné obsahující platný název transakce. Proměnná musí být deklarována pomocí datového typu char, varchar, nchar nebo nvarchar . Pokud proměnné předáte více než 32 znaků, použijí se pouze prvních 32 znaků. Zbývající znaky jsou zkráceny.

S MARKEM [ 'popis' ]

Platí pro: SQL Server 2008 (10.0.x) a novější verze, Azure SQL Database, Databáze Fabric a Azure SQL Managed Instance

Určuje, že transakce je označena v protokolu. description je řetězec, který popisuje značku. Popis delší než 128 znaků je před uložením msdb.dbo.logmarkhistory v tabulce zkrácen na 128 znaků.

Pokud WITH MARK se použije, musí být zadán název transakce. WITH MARK umožňuje obnovení transakčního protokolu na pojmenovanou značku.

Remarks

BEGIN TRANSACTION přírůstky @@TRANCOUNT o 1.

BEGIN TRANSACTION představuje bod, ve kterém jsou data odkazovaná připojením logicky a fyzicky konzistentní. Pokud dojde k chybám, všechny změny dat provedené po BEGIN TRANSACTION vrácení zpět, aby se data vrátila do tohoto známého stavu konzistence. Každá transakce trvá až do doby, než se dokončí bez chyb a COMMIT TRANSACTION vydá se k provedení změn trvalé části databáze, nebo dojde k chybám a všechny úpravy se vymažou příkazem ROLLBACK TRANSACTION .

BEGIN TRANSACTION spustí místní transakci pro připojení vydávající příkaz. V závislosti na aktuálním nastavení izolace transakce, mnoho prostředků získaných pro podporu Transact-SQL příkazů vydaných připojením jsou uzamčeny transakcí, dokud se dokončí buď s příkazem COMMIT TRANSACTION nebo příkazem ROLLBACK TRANSACTION . Transakce, které zůstaly nevyřízené po dlouhou dobu, můžou ostatním uživatelům zabránit v přístupu k těmto uzamčeným prostředkům a také můžou zabránit zkrácení protokolu.

I když BEGIN TRANSACTION spouští místní transakci, není zaznamenána v transakčním protokolu, dokud aplikace pak neprovede akci, která musí být zaznamenána v protokolu, například spuštění INSERT, UPDATEnebo DELETE příkaz. Aplikace může provádět akce, jako je získání zámků za účelem ochrany úrovně SELECT izolace transakcí příkazů, ale v protokolu se nic nezaznamená, dokud aplikace neprovede akci úpravy.

Pojmenování více transakcí v řadě vnořených transakcí s názvem transakce má malý vliv na transakci. V systému je registrován pouze první (vnější) název transakce. Vrácení zpět k jinému názvu (kromě platného názvu bodu uložení) vygeneruje chybu. Žádná z příkazů se nespustí před vrácením zpět, ve skutečnosti se vrátí zpět v době, kdy k této chybě dojde. Příkazy se vrátí zpět pouze v případech, kdy je vnější transakce vrácena zpět.

Místní transakce spuštěná příkazem BEGIN TRANSACTION je eskalována na distribuovanou transakci, pokud jsou provedeny následující akce před potvrzením příkazu nebo vrácení zpět:

  • Spustí se INSERTpříkaz , DELETEnebo UPDATE příkaz, který odkazuje na vzdálenou tabulku na propojeném serveru. Příkaz INSERT, UPDATEnebo DELETE příkaz selže, pokud zprostředkovatel OLE DB použitý pro přístup k propojenému serveru nepodporuje ITransactionJoin rozhraní.

  • Volání vzdálené uložené procedury, pokud je možnost nastavena REMOTE_PROC_TRANSACTIONS na ON.

Místní kopie SQL Serveru se stane kontrolerem transakcí a používá microsoft Distributed Transaction Coordinator (MS DTC) ke správě distribuované transakce.

Transakce lze explicitně provést jako distribuovanou transakci pomocí BEGIN DISTRIBUTED TRANSACTION. Další informace naleznete v tématu BEGIN DISTRIBUTED TRANSACTION.

Pokud SET IMPLICIT_TRANSACTIONS je nastavena na ON, BEGIN TRANSACTION příkaz vytvoří dvě vnořené transakce. Další informace naleznete v tématu SET IMPLICIT_TRANSACTIONS.

Označené transakce

Tato WITH MARK možnost způsobí, že se název transakce umístí do transakčního protokolu. Při obnovení databáze do dřívějšího stavu lze označenou transakci použít místo data a času. Další informace naleznete v tématu Použití označených transakcí k obnovení souvisejících databází konzistentně a RESTORE příkazy.

Kromě toho jsou značky transakčních protokolů nezbytné, pokud potřebujete obnovit sadu souvisejících databází do logicky konzistentního stavu. Značky lze umístit do transakčních protokolů souvisejících databází distribuovanou transakcí. Obnovením sady souvisejících databází na tyto značky vznikne sada databází, které jsou konzistentně konzistentní. Umístění značek v souvisejících databázích vyžaduje speciální postupy.

Značka je umístěna v transakčním protokolu pouze v případě, že databáze je aktualizována označenou transakcí. Transakce, které neupravují data, nejsou označené.

BEGIN TRANSACTION <new_name> WITH MARK lze vnořit do již existující transakce, která není označena. Po provedení této <new_name> akce se stane názvem značky pro transakci bez ohledu na název, který transakce již mohla být zadána. V následujícím příkladu M2 je název značky.

BEGIN TRAN T1;

UPDATE table1 ...;

BEGIN TRAN M2 WITH MARK;
UPDATE table2 ...;
SELECT * from table1;

COMMIT TRAN M2;

UPDATE table3 ...;

COMMIT TRAN T1;

Při vnoření transakcí se zobrazí následující upozornění, pokud se pokusíte označit transakci, která je již označena:

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

Vyžaduje členství ve veřejné roli .

Examples

Ukázky kódu v tomto článku používají ukázkovou databázi AdventureWorks2025 nebo AdventureWorksDW2025, kterou si můžete stáhnout z domovské stránky Microsoft SQL Serveru pro ukázky a komunitní projekty .

A. Použití explicitní transakce

Platí pro: SQL Server 2008 (10.0.x) a novější verze, 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. Vrácení transakce zpět

Platí pro: SQL Server 2008 (10.0.x) a novější verze, Azure SQL Database, Fabric SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics, Analytics Platform System (PDW)

Následující příklad ukazuje účinek vrácení transakce zpět. V tomto příkladu příkaz ROLLBACK vrátí příkaz zpět INSERT , ale vytvořená tabulka stále existuje.

CREATE TABLE ValueTable (id INT);
BEGIN TRANSACTION;
    INSERT INTO ValueTable VALUES(1);
    INSERT INTO ValueTable VALUES(2);
ROLLBACK;

C. Pojmenování transakce

Platí pro: SQL Server 2008 (10.0.x) a novější verze, Azure SQL Database, Databáze Fabric, Azure SQL Managed Instance

Následující příklad ukazuje, jak pojmenovat transakci.

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. Označení transakce

Platí pro: SQL Server 2008 (10.0.x) a novější verze, Azure SQL Database, Databáze Fabric, Azure SQL Managed Instance

Následující příklad ukazuje, jak označit transakci. Transakce CandidateDelete je označena.

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