Udostępnij za pomocą


ROZPOCZNIJ TRANSAKCJĘ (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Magazyn w usłudze Microsoft FabricBaza danych SQL w usłudze Microsoft Fabric

Oznacza punkt początkowy jawnej transakcji lokalnej. Jawne transakcje zaczynają się od instrukcji BEGIN TRANSACTION i kończą się instrukcją COMMIT or ROLLBACK .

Transact-SQL konwencje składni

Syntax

Składnia dla programów SQL Server, Azure SQL Database, Fabric SQL Database i Azure SQL Managed Instance.

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

Składnia dla usługi Fabric Data Warehouse, Azure Synapse Analytics i Analytics Platform System (PDW).

BEGIN { TRAN | TRANSACTION }
[ ; ]

Arguments

transaction_name

Dotyczy: SQL Server 2008 (10.0.x) i nowsze wersje, Azure SQL Database, Fabric SQL Database i Azure SQL Managed Instance

Nazwa przypisana do transakcji. transaction_name muszą być zgodne z regułami dotyczącymi identyfikatorów, ale identyfikatory dłuższe niż 32 znaki nie są dozwolone. Użyj nazw transakcji tylko w najbardziej zewnętrznej parze zagnieżdżonych BEGIN...COMMIT lub BEGIN...ROLLBACK instrukcji. transaction_name zawsze uwzględnia wielkość liter, nawet jeśli w wystąpieniu programu SQL Server nie jest uwzględniana wielkość liter.

@tran_name_variable

Dotyczy: SQL Server 2008 (10.0.x) i nowsze wersje, Azure SQL Database, Fabric SQL Database i Azure SQL Managed Instance

Nazwa zmiennej zdefiniowanej przez użytkownika zawierająca prawidłową nazwę transakcji. Zmienna musi być zadeklarowana przy użyciu typu danych char, varchar, nchar lub nvarchar . Jeśli do zmiennej jest przekazywanych więcej niż 32 znaki, używane są tylko pierwsze 32 znaki. Pozostałe znaki są obcinane.

Z MARKIEM [ 'opis' ]

Dotyczy: SQL Server 2008 (10.0.x) i nowsze wersje, Azure SQL Database, Fabric SQL Database i Azure SQL Managed Instance

Określa, że transakcja jest oznaczona w dzienniku. description to ciąg opisujący znacznik. Opis dłuższy niż 128 znaków jest obcinany do 128 znaków przed zapisaniem msdb.dbo.logmarkhistory w tabeli.

W przypadku WITH MARK użycia należy określić nazwę transakcji. WITH MARK umożliwia przywrócenie dziennika transakcji do nazwanego znacznika.

Remarks

BEGIN TRANSACTION przyrosty @@TRANCOUNT według 1.

BEGIN TRANSACTION reprezentuje punkt, w którym dane, do których odwołuje się połączenie, są logicznie i fizycznie spójne. Jeśli wystąpią błędy, wszystkie modyfikacje danych wprowadzone po BEGIN TRANSACTION tym, jak można wycofać dane, aby zwrócić dane do tego znanego stanu spójności. Każda transakcja trwa do momentu zakończenia bez błędów i COMMIT TRANSACTION jest wystawiana w celu wprowadzenia modyfikacji stałej części bazy danych lub napotkania błędów, a wszystkie modyfikacje zostaną wymazane z instrukcją ROLLBACK TRANSACTION .

BEGIN TRANSACTION uruchamia transakcję lokalną dla połączenia wystawiającego instrukcję . W zależności od bieżących ustawień poziomu izolacji transakcji wiele zasobów nabytych w celu obsługi instrukcji Transact-SQL wystawionych przez połączenie jest zablokowanych przez transakcję, dopóki nie zakończy się z instrukcją COMMIT TRANSACTION lub ROLLBACK TRANSACTION . Transakcje pozostawione zaległe przez długi czas mogą uniemożliwić innym użytkownikom dostęp do tych zablokowanych zasobów, a także zapobiec obcinaniu dzienników.

Mimo że BEGIN TRANSACTION rozpoczyna transakcję lokalną, nie jest rejestrowana w dzienniku transakcji, dopóki aplikacja nie wykona akcji, która musi zostać zarejestrowana w dzienniku, na przykład wykonanie INSERTinstrukcji , UPDATElub DELETE . Aplikacja może wykonywać akcje, takie jak uzyskiwanie blokad w celu ochrony poziomu izolacji transakcji instrukcji SELECT , ale nic nie jest rejestrowane w dzienniku, dopóki aplikacja nie wykona akcji modyfikacji.

Nazewnictwo wielu transakcji w serii zagnieżdżonych transakcji z nazwą transakcji ma niewielki wpływ na transakcję. Tylko pierwsza (najbardziej zewnętrzna) nazwa transakcji jest zarejestrowana w systemie. Wycofanie do dowolnej innej nazwy (innej niż prawidłowa nazwa punktu zapisu) powoduje wygenerowanie błędu. Żadne z instrukcji wykonanych przed wycofaniem nie jest w rzeczywistości wycofane w momencie wystąpienia tego błędu. Instrukcje są wycofywane tylko wtedy, gdy zewnętrzna transakcja zostanie wycofana.

Transakcja lokalna uruchomiona przez BEGIN TRANSACTION instrukcję jest eskalowana do transakcji rozproszonej, jeśli następujące akcje są wykonywane przed zatwierdzeniu lub wycofaniu instrukcji:

  • Wykonywana INSERTjest instrukcja , DELETElub UPDATE , która odwołuje się do tabeli zdalnej na serwerze połączonym. Instrukcja INSERT, UPDATElub DELETE kończy się niepowodzeniem, jeśli dostawca OLE DB używany do uzyskiwania dostępu do serwera połączonego nie obsługuje interfejsu ITransactionJoin .

  • Wywołanie jest wykonywane do zdalnej procedury składowanej, gdy opcja jest ustawiona REMOTE_PROC_TRANSACTIONS na ON.

Lokalna kopia programu SQL Server staje się kontrolerem transakcji i używa narzędzia Microsoft Distributed Transaction Coordinator (MS DTC) do zarządzania transakcją rozproszoną.

Transakcję można jawnie wykonać jako transakcję rozproszoną przy użyciu polecenia BEGIN DISTRIBUTED TRANSACTION. Aby uzyskać więcej informacji, zobacz BEGIN DISTRIBUTED TRANSACTION (ROZPOCZNIJ TRANSAKCJĘ ROZPROSZONĄ).

Gdy SET IMPLICIT_TRANSACTIONS jest ustawiona wartość ON, instrukcja tworzy BEGIN TRANSACTION dwie zagnieżdżone transakcje. Aby uzyskać więcej informacji, zobacz SET IMPLICIT_TRANSACTIONS.

Oznaczone transakcje

Opcja WITH MARK powoduje umieszczenie nazwy transakcji w dzienniku transakcji. Podczas przywracania bazy danych do wcześniejszego stanu oznaczona transakcja może być używana zamiast daty i godziny. Aby uzyskać więcej informacji, zobacz Używanie oznaczonych transakcji do odzyskiwania powiązanych baz danych spójnie i instrukcji RESTORE.

Ponadto znaczniki dziennika transakcji są niezbędne, jeśli konieczne jest odzyskanie zestawu powiązanych baz danych z logicznie spójnym stanem. Znaczniki można umieścić w dziennikach transakcji powiązanych baz danych przez transakcję rozproszoną. Odzyskanie zestawu powiązanych baz danych z tymi znakami powoduje utworzenie zestawu baz danych, które są spójne transakcyjnie. Umieszczanie znaków w powiązanych bazach danych wymaga specjalnych procedur.

Znacznik jest umieszczany w dzienniku transakcji tylko wtedy, gdy baza danych jest aktualizowana przez oznaczoną transakcję. Transakcje, które nie modyfikują danych, nie są oznaczone.

BEGIN TRANSACTION <new_name> WITH MARK można zagnieżdżać w ramach już istniejącej transakcji, która nie jest oznaczona. W takim <new_name> przypadku staje się nazwą znaku dla transakcji, pomimo nazwy, którą transakcja mogła już nadać. W poniższym przykładzie M2 jest nazwą znacznika.

BEGIN TRAN T1;

UPDATE table1 ...;

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

COMMIT TRAN M2;

UPDATE table3 ...;

COMMIT TRAN T1;

Podczas zagnieżdżania transakcji zostanie wyświetlony następujący komunikat ostrzegawczy, jeśli spróbujesz oznaczyć transakcję, która jest już oznaczona:

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

Wymaga członkostwa w publicznej roli .

Examples

Przykłady kodu w tym artykule korzystają z przykładowej bazy danych AdventureWorks2025 lub AdventureWorksDW2025, którą można pobrać ze strony głównej Przykładów programu Microsoft SQL Server i projektów społeczności.

A. Używanie transakcji jawnej

Dotyczy: SQL Server 2008 (10.0.x) i nowsze wersje, 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. Wycofywanie transakcji

Dotyczy: SQL Server 2008 (10.0.x) i nowsze wersje, Azure SQL Database, Fabric SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics, Analytics Platform System (PDW)

W poniższym przykładzie pokazano efekt wycofywania transakcji. W tym przykładzie ROLLBACK instrukcja wycofa instrukcję INSERT , ale utworzona tabela nadal istnieje.

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

C. Nazwij transakcję

Dotyczy: SQL Server 2008 (10.0.x) i nowsze wersje, Azure SQL Database, Fabric SQL Database, Azure SQL Managed Instance

W poniższym przykładzie pokazano, jak nazwać transakcję.

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. Oznaczanie transakcji

Dotyczy: SQL Server 2008 (10.0.x) i nowsze wersje, Azure SQL Database, Fabric SQL Database, Azure SQL Managed Instance

W poniższym przykładzie pokazano, jak oznaczyć transakcję. Transakcja CandidateDelete jest oznaczona.

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