Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Magazyn w usłudze Microsoft Fabric
Baza danych SQL w usłudze Microsoft Fabric
Ustawia BEGIN TRANSACTION tryb na implicit, dla połączenia.
Transact-SQL konwencje składni
Składnia
SET IMPLICIT_TRANSACTIONS { ON | OFF }
Uwagi
Gdy ON, system znajduje się w trybie transakcji niejawnej . Oznacza to, że jeśli @@TRANCOUNT = 0, dowolna z poniższych Transact-SQL instrukcji rozpoczyna nową transakcję. To odpowiednik egzekucji niewidzialnej BEGIN TRANSACTION osoby jako pierwszej:
ALTER TABLEBEGIN TRANSACTIONCREATEDELETEDROPFETCHGRANTINSERTMERGEOPENREVOKE-
SELECT(Zobacz uwagę wyjaśniającą) TRUNCATE TABLEUPDATE
Gdy , OFFkażde z poprzednich instrukcji T-SQL jest ograniczone przez inservację unseen i unseen (niewidzialną BEGIN TRANSACTIONCOMMIT TRANSACTION ). Gdy OFF, mówimy, że tryb transakcji jest automatycznym zatwierdzaniem. Jeśli Twój kod T-SQL wyraźnie generuje , BEGIN TRANSACTIONmówimy, że tryb transakcyjny jest wyraźny.
Jest kilka wyjaśniających kwestii, które warto zrozumieć:
Gdy tryb transakcji jest domyślny, nie jest wydawana żadna niewidzialna
BEGIN TRANSACTIONopcja, jeśli już się nie@@TRANCOUNT > 0pojawia. Jednak wszelkie jawneBEGIN TRANSACTIONstwierdzenia nadal rosną@@TRANCOUNT.Gdy Twoje
INSERTzestawienia i wszystko inne z jednostki pracy zostaną ukończone, musisz wydawaćCOMMIT TRANSACTIONwyciągi, aż do momentu, gdy@@TRANCOUNTogłoszenie zostanie zredukowane z powrotem do 0. Albo możesz wydać jedenROLLBACK TRANSACTION.
SELECTInstrukcje, które nie wybierają z tabeli, nie rozpoczynają transakcji domyślnych. Na przykład, alboSELECT GETDATE();SELECT 1, 'ABC';nie wymagają transakcji.Transakcje domyślne mogą niespodziewanie wynikać
ONz niewypłacalności ANSI. Szczegóły można znaleźć w SET ANSI_DEFAULTS.Ustawianie
IMPLICIT_TRANSACTIONSsię nieONjest popularne. W większości przypadków, gdzieIMPLICIT_TRANSACTIONSjest ,ONto dlatego, żeSET ANSI_DEFAULTS ONzostał ustawiony.SQL Server Native Client OLE DB Provider for SQL Server oraz SQL Server Native Client ODBC driver automatycznie ustawione
IMPLICIT_TRANSACTIONSpodczasOFFłączenia. Domyślnie ustawIMPLICIT_TRANSACTIONSna dlaOFFpołączeń z zarządzanym dostawcą SQLClient oraz dla żądań SOAP otrzymywanych przez punkty końcowe HTTP.
Aby zobaczyć aktualne ustawienie dla IMPLICIT_TRANSACTIONS, wykonaj następujące zapytanie.
DECLARE @IMPLICIT_TRANSACTIONS AS VARCHAR (3) = 'OFF';
IF ((2 & @@OPTIONS) = 2)
SET @IMPLICIT_TRANSACTIONS = 'ON';
SELECT @IMPLICIT_TRANSACTIONS AS IMPLICIT_TRANSACTIONS;
Przykłady
Poniższy Transact-SQL skrypt uruchamia kilka różnych przypadków testowych. Dostępny jest również tekst wyjściowy, który pokazuje szczegółowe zachowanie i wyniki każdego przypadku testowego.
-- Preparations.
SET NOCOUNT ON;
SET IMPLICIT_TRANSACTIONS OFF;
GO
WHILE (@@TRANCOUNT > 0) COMMIT TRANSACTION;
GO
IF (OBJECT_ID(N'dbo.t1',N'U') IS NOT NULL) DROP TABLE dbo.t1;
GO
CREATE table dbo.t1 (a INT);
GO
PRINT N'-------- [Test A] ---- OFF ----';
PRINT N'[A.01] Now, SET IMPLICIT_TRANSACTIONS OFF.';
PRINT N'[A.02] @@TRANCOUNT, at start, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
SET IMPLICIT_TRANSACTIONS OFF;
GO
INSERT INTO dbo.t1 VALUES (11);
INSERT INTO dbo.t1 VALUES (12);
PRINT N'[A.03] @@TRANCOUNT, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
PRINT N' ';
PRINT N'-------- [Test B] ---- ON ----';
PRINT N'[B.01] Now, SET IMPLICIT_TRANSACTIONS ON.';
PRINT N'[B.02] @@TRANCOUNT, at start, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
SET IMPLICIT_TRANSACTIONS ON;
GO
INSERT INTO dbo.t1 VALUES (21);
INSERT INTO dbo.t1 VALUES (22);
PRINT N'[B.03] @@TRANCOUNT, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
COMMIT TRANSACTION;
PRINT N'[B.04] @@TRANCOUNT, after COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
PRINT N' ';
PRINT N'-------- [Test C] ---- ON, then BEGIN TRAN ----';
PRINT N'[C.01] Now, SET IMPLICIT_TRANSACTIONS ON.';
PRINT N'[C.02] @@TRANCOUNT, at start, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
SET IMPLICIT_TRANSACTIONS ON;
GO
BEGIN TRANSACTION;
INSERT INTO dbo.t1 VALUES (31);
INSERT INTO dbo.t1 VALUES (32);
PRINT N'[C.03] @@TRANCOUNT, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
COMMIT TRANSACTION;
PRINT N'[C.04] @@TRANCOUNT, after a COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
COMMIT TRANSACTION;
PRINT N'[C.05] @@TRANCOUNT, after another COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
PRINT N' ';
PRINT N'-------- [Test D] ---- ON, INSERT, BEGIN TRAN, INSERT ----';
PRINT N'[D.01] Now, SET IMPLICIT_TRANSACTIONS ON.';
PRINT N'[D.02] @@TRANCOUNT, at start, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
SET IMPLICIT_TRANSACTIONS ON;
GO
INSERT INTO dbo.t1 VALUES (41);
BEGIN TRANSACTION;
INSERT INTO dbo.t1 VALUES (42);
PRINT N'[D.03] @@TRANCOUNT, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
COMMIT TRANSACTION;
PRINT N'[D.04] @@TRANCOUNT, after a COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
COMMIT TRANSACTION;
PRINT N'[D.05] @@TRANCOUNT, after another COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
-- Clean up.
SET IMPLICIT_TRANSACTIONS OFF;
GO
WHILE (@@TRANCOUNT > 0) COMMIT TRANSACTION;
GO
DROP TABLE dbo.t1;
GO
Następnie tekst wychodzi z poprzedniego Transact-SQL skryptu.
-------- [Test A] ---- OFF ----
[A.01] Now, SET IMPLICIT_TRANSACTIONS OFF.
[A.02] @@TRANCOUNT, at start, == 0
[A.03] @@TRANCOUNT, after INSERTs, == 0
-------- [Test B] ---- ON ----
[B.01] Now, SET IMPLICIT_TRANSACTIONS ON.
[B.02] @@TRANCOUNT, at start, == 0
[B.03] @@TRANCOUNT, after INSERTs, == 1
[B.04] @@TRANCOUNT, after COMMIT, == 0
-------- [Test C] ---- ON, then BEGIN TRAN ----
[C.01] Now, SET IMPLICIT_TRANSACTIONS ON.
[C.02] @@TRANCOUNT, at start, == 0
[C.03] @@TRANCOUNT, after INSERTs, == 2
[C.04] @@TRANCOUNT, after a COMMIT, == 1
[C.05] @@TRANCOUNT, after another COMMIT, == 0
-------- [Test D] ---- ON, INSERT, BEGIN TRAN, INSERT ----
[D.01] Now, SET IMPLICIT_TRANSACTIONS ON.
[D.02] @@TRANCOUNT, at start, == 0
[D.03] @@TRANCOUNT, after INSERTs, == 2
[D.04] @@TRANCOUNT, after a COMMIT, == 1
[D.05] @@TRANCOUNT, after another COMMIT, == 0
Treści powiązane
- ZMIEŃ TABELĘ (Transact-SQL)
- ROZPOCZNIJ TRANSAKCJĘ (Transact-SQL)
- CREATE TABLE (Transact-SQL)
- USUŃ (Transact-SQL)
- TABELA DROP (Transact-SQL)
- PRZYNIEŚ (Transact-SQL)
- DOTACJA (Transact-SQL)
- WSTAW (Transact-SQL)
- MERGE (Transact-SQL)
- OTWÓRZ (Transact-SQL)
- ODWOŁAJ (Transact-SQL)
- WYBIERZ (Transact-SQL)
- INSTRUKCJE SET (Transact-SQL)
- ZESTAW ANSI_DEFAULTS (Transact-SQL)
- @@TRANCOUNT (Transact-SQL)
- STÓŁ OBCIĘĆ (Transact-SQL)
- AKTUALIZACJA (Transact-SQL)