Blok Atom dalam Prosedur Asli
Berlaku untuk: SQL ServerAzure SQL Database Azure 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. |