Aracılığıyla paylaş


GERI ALMA İŞLEMI (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsAnaliz Platformu Sistemi (PDW)Microsoft Fabric'te ambarMicrosoft Fabric'te SQL veritabanı

Bu deyim, açık veya örtük bir işlemi işlemin başına veya işlemin içindeki bir kayıt noktasına geri alır. İşlemin başlangıcından veya bir kayıt noktasından yapılan tüm veri değişikliklerini silmek için kullanırsınız ROLLBACK TRANSACTION . ROLLBACK TRANSACTION ayrıca işlem tarafından tutulan kaynakları serbesttir.

Yerel değişkenlerde veya tablo değişkenlerinde yapılan değişiklikler bu deyimle silinmez.

Transact-SQL söz dizimi kuralları

Syntax

SQL Server, Azure SQL Veritabanı, Azure SQL Yönetilen Örneği, Microsoft Fabric'te SQL veritabanı için söz dizimi.

ROLLBACK { TRAN | TRANSACTION }
    [ transaction_name | @tran_name_variable
    | savepoint_name | @savepoint_variable ]
[ ; ]

Doku Veri Ambarı, Azure Synapse Analytics ve Paralel Veri Ambarı Veritabanı için söz dizimi.

ROLLBACK { TRAN | TRANSACTION }
[ ; ]

Arguments

transaction_name

Şunlar için geçerlidir: SQL Server 2008 (10.0.x) ve sonraki sürümleri, Azure SQL Veritabanı, Azure SQL Yönetilen Örneği, Microsoft Fabric'teki SQL veritabanı.

ile BEGIN TRANSACTIONişleme atanan ad. transaction_name tanımlayıcıların kurallarına uyması gerekir, ancak işlem adının yalnızca ilk 32 karakteri kullanılır. İç işlemler olduğunda , transaction_name en BEGIN TRANSACTION dıştaki deyimdeki ad olmalıdır. veritabanı altyapısı örneği büyük/küçük harfe duyarlı olmasa bile transaction_name her zaman büyük/küçük harfe duyarlıdır.

@tran_name_variable

Şunlar için geçerlidir: SQL Server 2008 (10.0.x) ve sonraki sürümleri, Azure SQL Veritabanı, Azure SQL Yönetilen Örneği, Microsoft Fabric'teki SQL veritabanı.

Geçerli bir işlem adı içeren kullanıcı tanımlı değişkenin adı. Değişkenin char, varchar, nchar veya nvarchar veri türüyle bildirilmesi gerekir.

savepoint_name

birSAVE TRANSACTION deyimden savepoint_name. savepoint_name tanımlayıcıların kurallarına uymalıdır. Geri alma işleminin yalnızca kayıt noktasından sonraki kısmını etkilemesi gerektiğinde savepoint_name kullanın.

@savepoint_variable

Geçerli bir kayıt noktası adı içeren kullanıcı tanımlı değişkenin adı. Değişkenin char, varchar, nchar veya nvarchar veri türüyle bildirilmesi gerekir.

Hata yönetimi

Deyimi ROLLBACK TRANSACTION kullanıcıya herhangi bir ileti üretmez. Saklı yordamlarda veya tetikleyicilerde uyarı gerekiyorsa veya RAISERROR deyimlerini kullanınPRINT.

Remarks

ROLLBACK TRANSACTION savepoint_name veya transaction_name olmadan işlemin başına geri döner. İç işlemler olduğunda, bu aynı deyim tüm iç işlemleri en BEGIN TRANSACTION dıştaki deyime geri alır. Her iki durumda da sistem ROLLBACK TRANSACTION işlevini 0 olarak değiştirir @@TRANCOUNT . ROLLBACK TRANSACTION savepoint_name azaltmaz @@TRANCOUNT.

ROLLBACK TRANSACTIONile açıkça BEGIN DISTRIBUTED TRANSACTION başlatılan veya yerel bir işlemden yükseltilen dağıtılmış işlemlerdeki bir savepoint_name başvuramaz.

bir deyim yürütüldükten sonra COMMIT TRANSACTION bir işlem geri alınamaz, ancak COMMIT TRANSACTION geri alınan işlem içinde yer alan bir iç işlemle ilişkilendirildiğinde. Bu örnekte, iç işlem için bir COMMIT TRANSACTION yayımlamış olsanız bile geri alınır.

Bir işlem içinde, yinelenen kayıt noktası adlarına izin verilir, ancak ROLLBACK TRANSACTION yinelenen kayıt noktası adı kullanıldığında yalnızca bu kayıt noktası adı kullanılarak en son SAVE TRANSACTION kullanılana geri alınır.

Uyarı

Veritabanı Altyapısı bağımsız olarak yönetilebilir iç içe işlemleri desteklemez. İç işlem işlemesi azalsa @@TRANCOUNT da başka etkisi yoktur. İç işlemin geri alınması, bir kayıt noktası olmadığı ve deyiminde ROLLBACK belirtilmediği sürece her zaman dış işlemi geri alır.

Interoperability

Saklı yordamlarda, ROLLBACK TRANSACTIONsavepoint_name veya transaction_name olmayan bir deyim tüm deyimleri en BEGIN TRANSACTIONdıştaki öğesine geri alır. ROLLBACK TRANSACTION Saklı yordamdaki bir deyim, yordam tamamlandığında yordam başlangıcındaki değerden farklı bir değere sahip olmasına neden olan @@TRANCOUNT bir bilgilendirme iletisi üretir. Bu ileti sonraki işlemleri etkilemez.

Tetikleyicide bir ROLLBACK TRANSACTION verilirse:

  • Geçerli işlemde bu noktada yapılan tüm veri değişiklikleri, tetikleyici tarafından yapılanlar da dahil olmak üzere geri alınır.

  • Tetikleyici, deyiminden sonra kalan deyimleri yürütmeye ROLLBACK devam eder. Bu deyimlerden herhangi biri verileri değiştirirse, değişiklikler geri alınamaz. Bu kalan deyimlerin yürütülmesiyle iç içe tetikleyici tetiklenmez.

  • Tetikleyiciyi tetikleyen deyiminden sonraki toplu işteki deyimler yürütülemez.

@@TRANCOUNT otomatik komut modundayken bile tetikleyici girerken bir artırılır. Sistem bir tetikleyiciyi örtük bir iç işlem olarak ele alır.

ROLLBACK TRANSACTION Saklı yordamdaki bir deyim, yordamı çağıran toplu işteki sonraki deyimleri etkilemez. Toplu işlemdeki sonraki deyimler yürütülür.

Tetikleyicideki ROLLBACK TRANSACTION bir deyim, tetikleyiciyi tetikleyen deyimini içeren toplu işlemi sonlandırır. Toplu işteki sonraki deyimler yürütülemez.

İmleçler üzerindeki etkisi ROLLBACK aşağıdaki kurallarla tanımlanır:

  • CURSOR_CLOSE_ON_COMMIT olarak ayarlandığındaONROLLBACK, tüm açık imleçleri kapatır ancak serbest bırakmaz.

  • CURSOR_CLOSE_ON_COMMIT olarak ayarlandığındaOFF, ROLLBACK tamamen doldurulmuş açık zaman uyumlu STATIC veya INSENSITIVE imleçler veya zaman uyumsuz STATIC imleçler etkilenmez. Başka bir türe ait açık imleçler kapatılır ancak serbest bırakılmaz.

  • Bir toplu işlemi sonlandıran ve işlemi geri alan bir hata, hatayı oluşturan deyimini içeren toplu işte bildirilen tüm imleçleri serbest bırakıyor. Türüne veya ayarına CURSOR_CLOSE_ON_COMMITbakılmaksızın tüm imleçler serbest bırakılır. Bu, hatayı oluşturan toplu işlem tarafından çağrılan saklı yordamlarda bildirilen imleçleri içerir. Hatayı oluşturan toplu işlemden önce toplu işte bildirilen imleçler önceki iki kurala tabidir.

    Kilitlenme, bu tür bir hatanın örneğidir. Tetikleyicide ROLLBACK verilen bir deyim de bu davranışa neden olur.

Kilitleme davranışı

ROLLBACK TRANSACTION savepoint_name belirten bir deyim, yükseltilen ve dönüştürülen kilitler dışında, kayıt noktasının ötesinde alınan tüm kilitleri serbest bırakır. Bu kilitler serbest bırakılmaz ve önceki kilit moduna geri dönüştürülemez.

Permissions

Rolde public üyelik gerektirir.

Examples

Aşağıdaki örnek, adlandırılmış bir işlemi geri döndürmenin etkisini gösterir. Bir tablo oluşturduktan sonra, aşağıdaki deyimler adlandırılmış bir işlem başlatır, iki satır ekler ve değişkeninde @TransactionNameadlı işlemi geri alır. Adlandırılmış işlemin dışındaki başka bir deyim iki satır ekler. Sorgu, önceki deyimlerin sonuçlarını döndürür.

USE tempdb;
CREATE TABLE ValueTable
(
    value INT
);

DECLARE @TransactionName AS VARCHAR (20) = 'Transaction1';

BEGIN TRANSACTION @TransactionName;

INSERT INTO ValueTable
VALUES (1), (2);

ROLLBACK TRANSACTION @TransactionName;

INSERT INTO ValueTable
VALUES (3), (4);

SELECT [value]
FROM ValueTable;

DROP TABLE ValueTable;

Sonuç kümesi aşağıdadır.

value
-----
3
4