SQL Server má čtyři režimy transakcí. Jedním z nich je implicitní režim.
Na serveru SQL Server je implicitní transakce, když je nová transakce implicitně zahájena po dokončení předchozí transakce, ale každá transakce je explicitně dokončena s COMMIT nebo ROLLBACK prohlášení.
Nezaměňujte to s režimem automatického potvrzení, kde je transakce zahájena a ukončena implicitně.
Čtyři režimy transakcí
SQL Server může pracovat v následujících režimech transakcí:
| Režim transakce | Popis |
|---|---|
| Automatické potvrzení transakce | Každý jednotlivý výpis je transakce. |
| Implicitní transakce | Nová transakce je implicitně zahájena po dokončení předchozí transakce, ale každá transakce je dokončena explicitně, obvykle s COMMIT nebo ROLLBACK v závislosti na DBMS. |
| Explicitní transakce | Explicitně začíná řádkem, jako je START TRANSACTION , BEGIN TRANSACTION nebo podobné, v závislosti na DBMS, a explicitně potvrzené nebo vrácené zpět s příslušnými prohlášeními. |
| Transakce v dávkovém rozsahu | Platí pouze pro více aktivních sad výsledků (MARS). Explicitní nebo implicitní transakce, která začíná v rámci relace MARS, se stává transakcí s dávkovým rozsahem. |
Implicitní režim versus Autocommit
Na serveru SQL Server určité příkazy zahájí transakci automaticky při svém spuštění. Je to, jako by jim předcházelo neviditelné BEGIN TRANSACTION prohlášení.
Ve většině případů jsou tyto transakce také implicitně potvrzeny, jako by existovala neviditelná COMMIT TRANSACTION prohlášení. Říká se, že takové transakce jsou v režimu automatického potvrzení .
V ostatních případech neexistuje žádná neviditelná funkce COMMIT TRANSACTION aby odpovídala neviditelnému BEGIN TRANSACTION prohlášení. Transakce bude probíhat, dokud ji výslovně nepotvrdíte nebo ji nevrátíte zpět pomocí příkazu COMMIT TRANSACTION nebo ROLLBACK TRANSACTION prohlášení. V tomto případě se říká, že transakce je v implicitním režimu .
Zda transakce proběhne v implicitním režimu nebo režimu automatického potvrzení závisí na vašem IMPLICIT_TRANSACTIONS nastavení.
Výpisy, které zahajují implicitní transakci
Následující příkazy zahájí implicitní transakci na serveru SQL.
ALTER TABLEBEGIN TRANSACTIONCREATEDELETEDROPFETCHGRANTINSERTOPENREVOKESELECT(kromě těch, které nevybírají z tabulky, jako jeSELECT GETDATE()neboSELECT 1*1)TRUNCATE TABLEUPDATE
Kdykoli spustíte tyto příkazy T-SQL, zahájíte transakci. Ve většině případů bude transakce automaticky potvrzena. Takže jste zahájili a ukončili transakci, aniž byste to museli výslovně udělat.
Nicméně v závislosti na vašich IMPLICIT_TRANSACTIONS nastavení, možná budete muset transakci potvrdit explicitně.
Když IMPLICIT_TRANSACTIONS je OFF
Když vaše IMPLICIT_TRANSACTIONS nastavení je OFF , výše uvedené příkazy provádějí transakce v režimu automatického potvrzení. To znamená, že začínají a implicitně ukončit transakci.
Je to jako s neviditelným BEGIN TRANSACTION příkaz a neviditelný COMMIT TRANSACTION výpis, vše z jednoho výpisu.
V tomto případě nemusíte pro potvrzení nebo vrácení transakce nic dělat. Už to pro vás bylo hotové.
Když IMPLICIT_TRANSACTIONS je ON
Když vaše IMPLICIT_TRANSACTIONS nastavení je ON , výše uvedená tvrzení se chovají mírně odlišně.
Když IMPLICIT_TRANSACTIONS nastavení je ON , výše uvedené příkazy dostanou neviditelný BEGIN TRANSACTION příkaz, ale nedostanou odpovídající COMMIT TRANSACTION prohlášení.
To znamená, že musíte transakci explicitně potvrdit nebo vrátit zpět.
Pokud je však režim transakce implicitní, žádná neviditelná BEGIN TRANSACTION je vydáno, pokud transakce již probíhá.
Příklad
Zde je příklad pro demonstraci konceptu.
SELECT @@TRANCOUNT AS TransactionCount;
SET IMPLICIT_TRANSACTIONS OFF;
SELECT TOP 1 ProductName, ProductPrice FROM Products;
SELECT @@TRANCOUNT AS TransactionCount; Výsledek:
+--------------------+ | TransactionCount | |--------------------| | 0 | +--------------------+ (1 row affected) Commands completed successfully. +-------------------------+----------------+ | ProductName | ProductPrice | |-------------------------+----------------| | Left handed screwdriver | 25.99 | +-------------------------+----------------+ (1 row affected) +--------------------+ | TransactionCount | |--------------------| | 0 | +--------------------+ (1 row affected)
V tomto případě jsem nastavil IMPLICIT_TRANSACTIONS na OFF a spusťte SELECT prohlášení. To znamenalo, že SELECT příkaz běžel v režimu autocommit, a proto byla transakce zahájena a ukončena implicitně.
@@TRANCOUNT vrátil 0 , což znamená, že v tomto okamžiku neprobíhaly žádné transakce.
Tady je to znovu, ale tentokrát jsme nastavili IMPLICIT_TRANSACTIONS na ON .
SELECT @@TRANCOUNT AS TransactionCount;
SET IMPLICIT_TRANSACTIONS ON;
SELECT TOP 1 ProductName, ProductPrice FROM Products;
SELECT @@TRANCOUNT AS TransactionCount; Výsledek:
+--------------------+ | TransactionCount | |--------------------| | 0 | +--------------------+ (1 row affected) Commands completed successfully. +-------------------------+----------------+ | ProductName | ProductPrice | |-------------------------+----------------| | Left handed screwdriver | 25.99 | +-------------------------+----------------+ (1 row affected) +--------------------+ | TransactionCount | |--------------------| | 1 | +--------------------+ (1 row affected)
Poslední @@TRANCOUNT vrací hodnotu 1 . To znamená, že naše transakce stále probíhá.
@@TRANCOUNT vrátí číslo BEGIN TRANSACTION příkazy, které se vyskytly na aktuálním připojení. Nevydali jsme ho explicitně, ale jeden byl vydán implicitně.
Takže ve skutečnosti potřebujeme potvrdit tuto transakci (nebo ji vrátit zpět), abychom snížili @@TRANCOUNT až na 0 .
COMMIT TRANSACTION;
SELECT @@TRANCOUNT AS TransactionCount; Výsledek:
+--------------------+ | TransactionCount | |--------------------| | 0 | +--------------------+ (1 row affected)
Kód pro naši implicitní transakci by tedy měl obsahovat COMMIT prohlášení:
SELECT @@TRANCOUNT AS TransactionCount;
SET IMPLICIT_TRANSACTIONS ON;
SELECT TOP 1 ProductName, ProductPrice FROM Products;
COMMIT TRANSACTION;
SELECT @@TRANCOUNT AS TransactionCount; Výsledek:
+--------------------+ | TransactionCount | |--------------------| | 0 | +--------------------+ (1 row affected) Commands completed successfully. +-------------------------+----------------+ | ProductName | ProductPrice | |-------------------------+----------------| | Left handed screwdriver | 25.99 | +-------------------------+----------------+ (1 row affected) Commands completed successfully. +--------------------+ | TransactionCount | |--------------------| | 0 | +--------------------+ (1 row affected)
ANSI_DEFAULTS
Pokud zjistíte, že implicitní transakce jsou neočekávaně povoleny, může to být způsobeno ANSI_DEFAULTS nastavení.