Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure 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. |