Blok Atom dalam Prosedur Asli

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

BEGIN ATOMIC adalah bagian dari standar ANSI SQL. SQL Server mendukung blok atomik di tingkat atas prosedur tersimpan yang dikompilasi secara asli, serta untuk fungsi yang dikompilasi secara asli dan ditentukan pengguna skalar. Untuk informasi selengkapnya tentang fungsi-fungsi ini, lihat Fungsi Yang Ditentukan Pengguna Skalar untuk OLTP Dalam Memori.

  • Setiap prosedur tersimpan yang dikompilasi secara asli berisi tepat satu blok pernyataan Transact-SQL. Ini adalah blok ATOMIC.

  • Prosedur tersimpan Transact-SQL yang tidak asli dan ad hoc tidak mendukung blok atomik.

Blok atom dijalankan (secara atomik) dalam transaksi. Baik semua pernyataan dalam blok berhasil atau seluruh blok akan digulung balik ke titik penyimpanan yang dibuat di awal blok. Selain itu, pengaturan sesi diperbaiki untuk blok atom. Menjalankan blok atom yang sama dalam sesi dengan pengaturan yang berbeda akan menghasilkan perilaku yang sama, terlepas dari pengaturan sesi saat ini.

Penanganan Transaksi dan Kesalahan

Jika transaksi sudah ada pada sesi (karena batch menjalankan pernyataan BEGIN TRANSACTION dan transaksi tetap aktif), maka memulai blok atom akan membuat titik simpan dalam transaksi. Jika blok keluar tanpa pengecualian, titik penyimpanan yang dibuat untuk penerapan blok, tetapi transaksi tidak akan dilakukan sampai transaksi di tingkat sesi diterapkan. Jika blok melempar pengecualian, efek blok digulung balik tetapi transaksi di tingkat sesi akan dilanjutkan, kecuali pengecualiannya adalah transaksi-kiamat. Misalnya konflik tulis adalah transaksi-mendooming, tetapi bukan kesalahan pengecoran jenis.

Jika tidak ada transaksi aktif pada sesi, BEGIN ATOMIC akan memulai transaksi baru. Jika tidak ada pengecualian yang dilemparkan di luar cakupan blok, transaksi akan dilakukan di akhir blok. Jika blok melemparkan pengecualian (yaitu, pengecualian tidak tertangkap dan ditangani dalam blok), transaksi akan digulung balik. Untuk transaksi yang mencakup satu blok atomik (satu prosedur tersimpan yang dikompilasi secara asli), Anda tidak perlu menulis pernyataan BEGIN TRANSACTION dan COMMIT atau ROLLBACK eksplisit.

Prosedur tersimpan yang dikompilasi secara asli mendukung konstruksi TRY, CATCH, dan THROW untuk penanganan kesalahan. RAISERROR tidak didukung.

Contoh berikut mengilustrasikan perilaku penanganan kesalahan dengan blok atomik dan prosedur tersimpan yang dikompilasi secara asli:

-- sample table  
CREATE TABLE dbo.t1 (  
  c1 int not null primary key nonclustered  
)  
WITH (MEMORY_OPTIMIZED=ON)  
GO  
  
-- sample proc that inserts 2 rows  
CREATE PROCEDURE dbo.usp_t1 @v1 bigint not null, @v2 bigint not null  
WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER  
AS  
BEGIN ATOMIC  
WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english', DELAYED_DURABILITY = ON)  
  
  INSERT dbo.t1 VALUES (@v1)  
  INSERT dbo.t1 VALUES (@v2)  
  
END  
GO  
  
-- insert two rows  
EXEC dbo.usp_t1 1, 2  
GO  
  
-- verify we have no active transaction  
SELECT @@TRANCOUNT  
GO  
  
-- verify the rows 1 and 2 were committed  
SELECT c1 FROM dbo.t1  
GO  
  
-- execute proc with arithmetic overflow  
EXEC dbo.usp_t1 3, 4444444444444  
GO  
-- expected error message:  
-- Msg 8115, Level 16, State 0, Procedure usp_t1  
-- Arithmetic overflow error converting bigint to data type int.  
  
-- verify we have no active transaction  
SELECT @@TRANCOUNT  
GO  
  
-- verify rows 3 was not committed; usp_t1 has been rolled back  
SELECT c1 FROM dbo.t1  
GO  
  
-- start a new transaction  
BEGIN TRANSACTION  
  -- insert rows 3 and 4  
  EXEC dbo.usp_t1 3, 4  
  
  -- verify there is still an active transaction  
  SELECT @@TRANCOUNT  
  
  -- verify the rows 3 and 4 were inserted  
  SELECT c1 FROM dbo.t1 WITH (SNAPSHOT)   
  ORDER BY c1  
  
  -- catch the arithmetic overflow error  
  BEGIN TRY  
    EXEC dbo.usp_t1 5, 4444444444444  
  END TRY  
  BEGIN CATCH  
    PRINT N'Error occurred: ' + error_message()  
  END CATCH  
  
  -- verify there is still an active transaction  
  SELECT @@TRANCOUNT  
  
  -- verify rows 3 and 4 are still in the table, and row 5 has not been inserted  
  SELECT c1 FROM dbo.t1 WITH (SNAPSHOT)   
  ORDER BY c1  
  
COMMIT  
GO  
  
-- verify we have no active transaction  
SELECT @@TRANCOUNT  
GO  
  
-- verify rows 3 and 4 has been committed  
SELECT c1 FROM dbo.t1  
ORDER BY c1  
GO  

Pesan kesalahan berikut khusus untuk tabel yang dioptimalkan memori adalah kiamat transaksi. Jika terjadi dalam cakupan blok atom, mereka akan menyebabkan transaksi dibatalkan: 10772, 41301, 41302, 41305, 41325, 41332, 41333, dan 41839.

Pengaturan sesi

Pengaturan sesi dalam blok atom diperbaiki ketika prosedur tersimpan dikompilasi. Beberapa pengaturan dapat ditentukan dengan BEGIN ATOMIC sementara pengaturan lain selalu diperbaiki ke nilai yang sama.

Opsi berikut diperlukan dengan BEGIN ATOMIC:

Pengaturan yang Diperlukan Deskripsi
TINGKAT ISOLASI TRANSAKSI Nilai yang didukung adalah SNAPSHOT, REPEATABLEREAD, dan SERIALIZABLE.
BAHASA Menentukan format tanggal dan waktu dan pesan sistem. Semua bahasa dan alias dalam sys.syslanguages (Transact-SQL) didukung.

Pengaturan berikut bersifat opsional:

Pengaturan Opsional Deskripsi
DATEFORMAT Semua format tanggal SQL Server didukung. Ketika ditentukan, DATEFORMAT mengambil alih format tanggal default yang terkait dengan LANGUAGE.
DATEFIRST Jika ditentukan, DATEFIRST mengambil alih default yang terkait dengan LANGUAGE.
DELAYED_DURABILITY Nilai yang didukung adalah NONAKTIF dan AKTIF.

Penerapan transaksi SQL Server dapat sepenuhnya tahan lama, default, atau tertunda tahan lama. Untuk informasi selengkapnya, lihat Mengontrol Durabilitas Transaksi.

Opsi SET berikut memiliki nilai default sistem yang sama untuk semua blok atom di semua prosedur tersimpan yang dikompilasi secara asli:

Atur Opsi Default Sistem untuk Blok Atom
ANSI_NULLS AKTIF
ANSI_PADDING AKTIF
ANSI_WARNING AKTIF
ARITHABORT AKTIF
ARITHIGNORE TIDAK AKTIF
CONCAT_NULL_YIELDS_NULL AKTIF
IDENTITY_INSERT TIDAK AKTIF
NOCOUNT AKTIF
NUMERIC_ROUNDABORT TIDAK AKTIF
QUOTED_IDENTIFIER AKTIF
ROWCOUNT 0
TEXTSIZE 0
XACT_ABORT TIDAK AKTIF

Pengecualian yang tidak tertangkap menyebabkan blok atomik bergulir kembali, tetapi tidak menyebabkan transaksi dibatalkan kecuali kesalahannya adalah transaksi mendooming.

Lihat Juga

Prosedur Tersimpan yang Dikompilasi Secara Asli