Aracılığıyla paylaş


Yerel Prosedürlerde Atomik Bloklar

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen Örneği

BEGIN ATOMIC , ANSI SQL standardının bir parçasıdır. SQL Server, yerel olarak derlenmiş saklı yordamların en üst düzeyindeki atomik blokları ve yerel olarak derlenmiş, skaler kullanıcı tanımlı işlevleri destekler. Bu işlevler hakkında daha fazla bilgi için bkz. In-Memory OLTP için Skaler Kullanıcı Tanımlı Fonksiyonlar.

  • Yerel olarak derlenmiş her saklı yordam, tam olarak bir Transact-SQL deyimi bloğu içerir. Bu bir ATOMİK blok.

  • Yerel olmayan, yorumlanmış Transact-SQL saklı yordamlar ve geçici toplu işlemler atomik blokları desteklemez.

Atomik bloklar işlem içinde (atomik olarak) yürütülür. Bloktaki tüm ifadeler başarılı olursa, ya da başarısızlık durumunda, bloğun tamamı bloğun başında oluşturulan kayıt noktasına geri döndürülür. Buna ek olarak, oturum ayarları atomik blok için sabitlenir. Farklı ayarlarla oturumlarda aynı atomik bloğun yürütülmesi, geçerli oturumun ayarlarından bağımsız olarak aynı davranışa neden olur.

İşlemler ve Hata İşleme

Bir oturumda zaten bir işlem varsa (toplu işlem begin TRANSACTION deyimini yürüttüğü ve işlem etkin kaldığı için), atomik blok başlatmak işlemde bir kayıt noktası oluşturur. Blok özel durum olmadan çıkarsa, blok için oluşturulan kayıt noktası işlemeler, ancak işlem oturum düzeyinde işlemeye kadar işlemez. Blok bir istisna oluşturursa, bloğun etkileri geri alınır, ancak istisna işlemi geçersiz kılmadıkça oturum düzeyindeki işlem devam eder. Örneğin, yazma çakışması işlemi geçersiz kılar, ancak tür atama hatası bunu yapmaz.

Oturumda etkin bir işlem yoksa BEGIN ATOMIC yeni bir işlem başlatır. Blok kapsamında bir istisna oluşturulmazsa, işlem bloğun sonunda tamamlanır. Blok bir istisna fırlatırsa (yani, istisna blok içinde yakalanmaz ve işlenmezse), işlem geri alınır. Tek bir atomik bloğu kapsayan işlemler için (yerel olarak derlenmiş tek bir saklı yordam), açık BEGIN TRANSACTION ve COMMIT veya ROLLBACK deyimleri yazmanız gerekmez.

Yerel olarak derlenmiş saklı yordamlar hata işleme için TRY, CATCH ve THROW yapılarını destekler. RAISERROR desteklenmez.

Aşağıdaki örnekte atomik bloklar ve yerel olarak derlenmiş saklı yordamlarla hata işleme davranışı gösterilmektedir:

-- 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  

Bellek-iyileştirmeli tablolara özgü aşağıdaki hata iletileri işlemi geçersiz kılar. Atomik blok kapsamında oluşurlarsa, işlemin durdurulmasına neden olurlar: 10772, 41301, 41302, 41305, 41325, 41332, 41333 ve 41839.

Oturum Ayarları

Saklı yordam derlendiğinde atomik bloklardaki oturum ayarları sabitlenir. Bazı ayarlar BEGIN ATOMIC ile belirtilebilirken, diğer ayarlar her zaman aynı değere sabitlenir.

BEGIN ATOMIC ile aşağıdaki seçenekler gereklidir:

Gerekli Ayar Description
İŞLEM YALıTıM DÜZEYI Desteklenen değerler SNAPSHOT, REPEATABLEREAD ve SERIALIZABLE'dır.
DİL Tarih ve saat biçimlerini ve sistem iletilerini belirler. sys.syslanguages (Transact-SQL) içindeki tüm diller ve diğer adlar desteklenir.

Aşağıdaki ayarlar isteğe bağlıdır:

İsteğe Bağlı Ayar Description
DATEFORMAT Tüm SQL Server tarih biçimleri desteklenir. Belirtildiğinde DATEFORMAT , LANGUAGE ile ilişkili varsayılan tarih biçimini geçersiz kılar.
DATEFIRST Belirtildiğinde DATEFIRST , LANGUAGE ile ilişkili varsayılan değeri geçersiz kılar.
DELAYED_DURABILITY Desteklenen değerler KAPALI ve ON'dır.

SQL Server işlem işlemeleri tamamen dayanıklı, varsayılan veya gecikmeli dayanıklı olabilir. Daha fazla bilgi için bkz. İşlem Dayanıklılığını Denetleme.

Aşağıdaki SET seçenekleri, yerel olarak derlenmiş tüm saklı yordamlardaki tüm atomik bloklar için aynı sistem varsayılan değerine sahiptir:

Seçeneği Ayarla Atomik Bloklar için Sistem Varsayılanı
ANSI_NULLS ON
ANSI_PADDING ON
ANSI_WARNING ON
ARITHABORT ON
ARITHIGNORE OFF
CONCAT_NULL_YIELDS_NULL ON
IDENTITY_INSERT OFF
NOCOUNT ON
SAYISAL_YUVARLAMADURDUR OFF
TIRNAKLI_BELİRLEYİCİ ON
ROWCOUNT 0
TEXTSIZE 0
XACT_ABORT OFF

Yakalanmayan özel durumlar atomik bloğun geri alınmasına neden olur, ancak hata işlem iflas ettirici olmadığı sürece işlemin durdurulmasına neden olmaz.

Ayrıca Bkz.

Yerel Olarak Derlenmiş Saklı Yordamlar