Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana Transaksi Implisit Bekerja di SQL Server

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, seperti SELECT GETDATE() atau SELECT 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Penginstalan dan Konfigurasi SQL Server Log Pengiriman &Pemulihan Bencana -1

  2. Waktu kueri habis saat dijalankan dari web, tetapi sangat cepat saat dijalankan dari SSMS

  3. Dapatkan semua orang tua untuk seorang anak

  4. Bagaimana cara melewatkan parameter Bernilai Tabel dari java ke prosedur tersimpan server sql?

  5. Kesalahan SQL Server 206:Bentrokan jenis operan