Blok Atomik dalam Prosedur Asli
Berlaku untuk:
SQL Server (semua versi yang didukung)
Azure SQL Database
BEGIN ATOMIC adalah bagian dari standar SQL ANSI. SQL Server mendukung blok atomik di tingkat atas prosedur tersimpan yang dikompilasi secara asli, serta untuk fungsi yang dikompilasi secara asli dan skalar yang ditentukan pengguna. Untuk informasi selengkapnya tentang fungsi-fungsi ini, lihat Fungsi skalar User-Defined untuk In-Memory OLTP.
Setiap prosedur tersimpan yang dikompilasi secara asli berisi tepat satu blok pernyataan Transact-SQL. Ini adalah blok ATOMIC.
Prosedur tersimpan yang tidak asli dan ditafsirkan SQL transact dan batch ad hoc tidak mendukung blok atomik.
Blok atomik 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 atomik. 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 pada tingkat sesi berkomitmen. Jika blok melempar pengecualian, efek blok digulung balik tetapi transaksi pada tingkat sesi akan dilanjutkan, kecuali pengecualiannya adalah transaksi-mendooming. 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 melempar 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 mendooming 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 | Ketika ditentukan, DATEFIRST mengambil alih default yang terkait dengan LANGUAGE. |
| DELAYED_DURABILITY | Nilai yang didukung adalah OFF dan ON. SQL Server penerapan transaksi 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 atomik di semua prosedur tersimpan yang dikompilasi secara asli:
| Atur Opsi | Default Sistem untuk Blok Atomik |
|---|---|
| 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 terungkap menyebabkan blok atomik bergulir kembali, tetapi tidak menyebabkan transaksi dibatalkan kecuali kesalahannya adalah transaksi mendooming. |