Ada empat mode transaksi di SQL Server. Salah satunya adalah mode implisit.
Di SQL Server, transaksi implisit adalah saat transaksi baru dimulai secara implisit saat transaksi sebelumnya selesai, tetapi setiap transaksi secara eksplisit diselesaikan dengan COMMIT
atau ROLLBACK
pernyataan.
Ini berbeda dengan mode autocommit, di mana transaksi dimulai dan diakhiri secara implisit.
Empat Mode Transaksi
SQL Server dapat beroperasi dalam mode transaksi berikut:
Mode transaksi | Deskripsi |
---|---|
Transaksi komit otomatis | Setiap pernyataan individual adalah transaksi. |
Transaksi implisit | Transaksi baru secara implisit dimulai ketika transaksi sebelumnya selesai, tetapi setiap transaksi diselesaikan secara eksplisit, biasanya dengan COMMIT atau ROLLBACK pernyataan tergantung pada DBMS. |
Transaksi eksplisit | Secara eksplisit dimulai dengan baris seperti START TRANSACTION , START TRANSACTION atau serupa, tergantung pada DBMS, dan secara eksplisit berkomitmen atau dibatalkan dengan pernyataan yang relevan. |
Transaksi dengan cakupan batch | Hanya berlaku untuk beberapa set hasil aktif (MARS). Transaksi eksplisit atau implisit yang dimulai di bawah sesi MARS menjadi transaksi dengan cakupan batch. |
Mode Implisit vs Autocommit
Di SQL Server, pernyataan tertentu memulai transaksi secara otomatis saat dijalankan. Seolah-olah mereka didahului oleh START TRANSACTION
yang tidak terlihat pernyataan.
Dalam kebanyakan kasus, transaksi ini juga dilakukan secara implisit, seolah-olah ada COMMIT TRANSACTION
yang tidak terlihat. penyataan. Transaksi tersebut dikatakan dalam mode komit otomatis .
Dalam kasus lain, tidak ada COMMIT TRANSACTION
yang tidak terlihat untuk mencocokkan START TRANSACTION
invisible yang tidak terlihat penyataan. Transaksi tetap berlangsung sampai Anda secara eksplisit mengkomitnya atau mengembalikannya dengan COMMIT TRANSACTION
atau ROLLBACK TRANSACTION
penyataan. Dalam hal ini, transaksi dikatakan dalam mode implisit .
Apakah transaksi berjalan dalam mode implisit atau mode komit otomatis bergantung pada IMPLICIT_TRANSACTIONS
Anda pengaturan.
Pernyataan yang Memulai Transaksi Implisit
Pernyataan berikut memulai transaksi implisit di SQL Server.
ALTER TABLE
START TRANSACTION
CREATE
DELETE
DROP
FETCH
GRANT
INSERT
OPEN
REVOKE
SELECT
(kecuali yang tidak memilih dari tabel, sepertiSELECT GETDATE()
atauSELECT 1*1
)TRUNCATE TABLE
UPDATE
Setiap kali Anda menjalankan pernyataan T-SQL ini, Anda memulai transaksi. Sebagian besar waktu transaksi akan dilakukan secara otomatis. Jadi, Anda memulai dan mengakhiri transaksi tanpa harus melakukannya secara eksplisit.
Namun, tergantung pada IMPLICIT_TRANSACTIONS
Anda pengaturan, Anda mungkin perlu melakukan transaksi secara eksplisit.
Kapan IMPLICIT_TRANSACTIONS
adalah OFF
Saat IMPLICIT_TRANSACTIONS
Anda pengaturannya adalah OFF
, pernyataan di atas melakukan transaksi dalam mode autocommit. Artinya, mereka memulai dan akhiri transaksi secara implisit.
Jadi seperti memiliki START TRANSACTION
yang tidak terlihat pernyataan dan COMMIT TRANSACTION
yang tidak terlihat pernyataan, semua dari satu pernyataan.
Dalam hal ini, Anda tidak perlu melakukan apa pun untuk melakukan atau mengembalikan transaksi. Itu sudah dilakukan untuk Anda.
Kapan IMPLICIT_TRANSACTIONS
adalah ON
Saat IMPLICIT_TRANSACTIONS
Anda pengaturannya adalah ON
, pernyataan di atas berperilaku sedikit berbeda.
Ketika IMPLICIT_TRANSACTIONS
pengaturannya adalah ON
, pernyataan di atas mendapatkan START TRANSACTION
yang tidak terlihat pernyataan tetapi mereka tidak mendapatkan COMMIT TRANSACTION
yang sesuai pernyataan.
Ini berarti Anda harus secara eksplisit melakukan atau mengembalikan transaksi itu sendiri.
Namun, ketika mode transaksi implisit, tidak ada START TRANSACTION
. yang tidak terlihat dikeluarkan jika transaksi sudah berlangsung.
Contoh
Berikut adalah contoh untuk mendemonstrasikan konsep tersebut.
SELECT @@TRANCOUNT AS TransactionCount;
SET IMPLICIT_TRANSACTIONS OFF;
SELECT TOP 1 ProductName, ProductPrice FROM Products;
SELECT @@TRANCOUNT AS TransactionCount;
Hasil:
+--------------------+ | TransactionCount | |--------------------| | 0 | +--------------------+ (1 row affected) Commands completed successfully. +-------------------------+----------------+ | ProductName | ProductPrice | |-------------------------+----------------| | Left handed screwdriver | 25.99 | +-------------------------+----------------+ (1 row affected) +--------------------+ | TransactionCount | |--------------------| | 0 | +--------------------+ (1 row affected)
Dalam hal ini, saya mengatur IMPLICIT_TRANSACTIONS
ke OFF
dan jalankan SELECT
penyataan. Ini berarti bahwa SELECT
pernyataan berjalan dalam mode komit otomatis, dan oleh karena itu, transaksi dimulai dan diakhiri secara implisit.
@@TRANCOUNT
mengembalikan 0
, yang berarti tidak ada transaksi yang berjalan pada saat itu.
Ini dia lagi, kecuali kali ini kita set IMPLICIT_TRANSACTIONS
ke ON
.
SELECT @@TRANCOUNT AS TransactionCount;
SET IMPLICIT_TRANSACTIONS ON;
SELECT TOP 1 ProductName, ProductPrice FROM Products;
SELECT @@TRANCOUNT AS TransactionCount;
Hasil:
+--------------------+ | TransactionCount | |--------------------| | 0 | +--------------------+ (1 row affected) Commands completed successfully. +-------------------------+----------------+ | ProductName | ProductPrice | |-------------------------+----------------| | Left handed screwdriver | 25.99 | +-------------------------+----------------+ (1 row affected) +--------------------+ | TransactionCount | |--------------------| | 1 | +--------------------+ (1 row affected)
@@TRANCOUNT
terakhir mengembalikan nilai 1
. Artinya transaksi kita masih dalam proses.
@@TRANCOUNT
mengembalikan jumlah START TRANSACTION
pernyataan yang telah terjadi pada koneksi saat ini. Kami tidak secara eksplisit mengeluarkannya, tetapi satu dikeluarkan secara implisit.
Jadi kita sebenarnya perlu melakukan transaksi ini (atau memutarnya kembali) untuk mengurangi @@TRANCOUNT
ke 0
.
COMMIT TRANSACTION;
SELECT @@TRANCOUNT AS TransactionCount;
Hasil:
+--------------------+ | TransactionCount | |--------------------| | 0 | +--------------------+ (1 row affected)
Jadi kode untuk transaksi implisit kami harus menyertakan COMMIT
pernyataan:
SELECT @@TRANCOUNT AS TransactionCount;
SET IMPLICIT_TRANSACTIONS ON;
SELECT TOP 1 ProductName, ProductPrice FROM Products;
COMMIT TRANSACTION;
SELECT @@TRANCOUNT AS TransactionCount;
Hasil:
+--------------------+ | 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
Jika Anda menemukan bahwa transaksi implisit diaktifkan secara tidak terduga, itu mungkin karena ANSI_DEFAULTS
pengaturan.