Aracılığıyla paylaş


İŞLEM YALıTıM DÜZEYINI AYARLA (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalitik Platform Sistemi (PDW)Microsoft Fabric'te SQL veritabanı

SQL Server bağlantısı tarafından verilen Transact-SQL deyimlerinin kilitleme ve satır sürüm oluşturma davranışını denetler.

Transact-SQL söz dizimi kuralları

Sözdizimi

Microsoft Fabric'te SQL Server, Azure SQL Veritabanı ve SQL veritabanı için söz dizimi.

SET TRANSACTION ISOLATION LEVEL
    { READ UNCOMMITTED
    | READ COMMITTED
    | REPEATABLE READ
    | SNAPSHOT
    | SERIALIZABLE
    }

Azure Synapse Analytics ve Paralel Veri Ambarı söz dizimi.

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Uyarı

Azure Synapse Analytics ACID işlemlerini uygular. Varsayılan yalıtım düzeyi şeklindedir READ UNCOMMITTED. Veritabanına bağlıyken READ COMMITTED SNAPSHOT ISOLATION bir kullanıcı veritabanı için veritabanı seçeneğini döndürerek ONREAD_COMMITTED_SNAPSHOT bunu olarak değiştirebilirsinizmaster. Etkinleştirildikten sonra bu veritabanındaki tüm işlemler altında READ COMMITTED SNAPSHOT ISOLATION yürütülür ve oturum düzeyindeki ayar READ UNCOMMITTED kabul edilmez. Daha fazla bilgi için bkz. ALTER DATABASE SET options (Transact-SQL).

Arguments

OKUNMAMıŞ OKUMA

Deyimlerin diğer işlemler tarafından değiştirilen ancak henüz işlenmeyen satırları okuyabileceğini belirtir.

Düzeyinde çalışan işlemler, diğer işlemlerin READ UNCOMMITTED geçerli işlem tarafından okunan verileri değiştirmesini önlemek için paylaşılan kilitler vermez. READ UNCOMMITTED işlemler, geçerli işlemin değiştirilmiş ancak diğer işlemler tarafından işlenmeyen satırları okumasını engelleyecek özel kullanım kilitleri tarafından da engellenmez. Bu seçenek ayarlandığında, kirli okumalar olarak adlandırılan kaydedilmemiş değişiklikleri okumak mümkündür. Verilerdeki değerler değiştirilebilir ve işlem bitmeden önce veri kümesinde satırlar görüntülenebilir veya kaybolabilir. Bu seçenek, bir işlemdeki tüm deyimlerdeki tüm NOLOCK tablolarda ayar yapmakla SELECT aynı etkiye sahiptir. Bu, yalıtım düzeylerinin en az kısıtlayıcı olmasıdır.

SQL Server'da, aşağıdakilerden birini kullanarak işlemleri kaydedilmemiş veri değişikliklerinin kirli okumalarına karşı korurken kilitlenme çekişmelerini de en aza indirebilirsiniz:

  • READ COMMITTED Veritabanı seçeneğinin READ_COMMITTED_SNAPSHOT olarak ayarlandığı ONyalıtım düzeyi.

  • Yalıtım SNAPSHOT düzeyi. Anlık görüntü yalıtımı hakkında daha fazla bilgi için bkz. SQL Server'da Anlık Görüntü Yalıtımı.

OKUNDU

Deyimlerin değiştirilen ancak diğer işlemler tarafından işlenmeyen verileri okuyamadığını belirtir. Bu, kirli okumaları önler. Veriler, geçerli işlem içindeki tek tek deyimler arasındaki diğer işlemler tarafından değiştirilebilir ve bu da güncelleştirilemez okumalar veya hayalet veriler ile sonuçlanabilir. Bu seçenek varsayılan SQL Server'dır.

davranışı READ COMMITTED , veritabanı seçeneğinin ayarına READ_COMMITTED_SNAPSHOT bağlıdır:

  • (SQL Server'da varsayılan) olarak ayarlanırsa READ_COMMITTED_SNAPSHOTOFF Veritabanı Altyapısı, geçerli işlem bir okuma işlemi çalıştırırken diğer işlemlerin satırları değiştirmesini önlemek için paylaşılan kilitleri kullanır. Paylaşılan kilitler, diğer işlem tamamlanana kadar deyimin diğer işlemler tarafından değiştirilen satırları okumasını da engeller. Paylaşılan kilit türü ne zaman serbest bırakileceğini belirler. Satır kilitleri, sonraki satır işlenmeden önce serbest bırakılır. Sayfa kilitleri, sonraki sayfa okunduğunda, tablo kilitleri ise deyim tamamlandığında serbest bırakılır.

  • olarak ayarlanırsa READ_COMMITTED_SNAPSHOTON, Veritabanı Altyapısı her deyimi deyiminin başında mevcut olan verilerin işlemsel olarak tutarlı bir anlık görüntüsüyle sunmak için satır sürümü oluşturmayı kullanır. Kilitler, verileri diğer işlemler tarafından yapılan güncelleştirmelerden korumak için kullanılmaz.

    • READ_COMMITTED_SNAPSHOT ON Azure SQL Veritabanı ve Microsoft Fabric'teki SQL veritabanı için varsayılan özelliktir.

Önemli

İşlem yalıtım düzeyinin seçilmesi, veri değişikliklerini korumak için alınan kilitleri etkilemez. İşlem, değiştirdiği veriler üzerinde her zaman özel bir kilit alır ve işlem için ayarlanan yalıtım düzeyi ne olursa olsun işlem tamamlanana kadar bu kilidi tutar. Ayrıca yalıtım düzeyinde yapılan READ COMMITTED bir güncelleştirme, seçilen veri satırlarında güncelleştirme kilitlerini kullanırken, yalıtım düzeyinde yapılan SNAPSHOT bir güncelleştirme güncelleştirilecek satırları seçmek için satır sürümlerini kullanır. Okuma işlemleri için, işlem yalıtım düzeyleri öncelikli olarak diğer işlemler tarafından yapılan değişikliklerin etkilerine karşı koruma düzeyini tanımlar. Daha fazla bilgi için bkz. İşlem Kilitleme ve Satır Sürüm Oluşturma Kılavuzu.

Anlık görüntü yalıtımı FILESTREAM verilerini destekler. Anlık görüntü yalıtım modu altında, bir işlemdeki herhangi bir deyim tarafından okunan FILESTREAM verileri, işlemin başlangıcında var olan verilerin işlem açısından tutarlı sürümüdür.

READ_COMMITTED_SNAPSHOT Veritabanı seçeneği olduğundaON, yalıtım düzeyinde çalışan işlemlerde tek tek deyimler için satır sürümü oluşturma yerine paylaşılan kilitleme istemek için tablo ipucunu READCOMMITTEDLOCK kullanabilirsinizREAD COMMITTED.

Uyarı

seçeneğini ayarladığınızda READ_COMMITTED_SNAPSHOT , veritabanında yalnızca komutu yürüten ALTER DATABASE bağlantıya izin verilir. Tamamlanana kadar ALTER DATABASE veritabanında başka açık bağlantı olmamalıdır. Veritabanının tek kullanıcılı modda olması gerekmez.

YINELENEBILIR OKUMA

Deyimlerin değiştirilmiş ancak henüz başka işlemler tarafından işlenmemiş verileri okuyamadığını ve geçerli işlem tamamlanana kadar başka hiçbir işlemin geçerli işlem tarafından okunan verileri değiştiremediğini belirtir.

Paylaşılan kilitler, işlemdeki her deyim tarafından okunan tüm verilere yerleştirilir ve işlem tamamlanana kadar tutulur. Bu, diğer işlemlerin geçerli işlem tarafından okunan satırları değiştirmesini önler. Diğer işlemler, geçerli işlem tarafından verilen deyimlerin arama koşullarıyla eşleşen yeni satırlar ekleyebilir. Geçerli işlem deyimini yeniden denenirse, yeni satırları alır ve bu da hayalet okumalara neden olur. Paylaşılan kilitler her deyimin sonunda serbest bırakılmak yerine işlemin sonunda tutulacağından eşzamanlılık varsayılan READ COMMITTED yalıtım düzeyinden daha düşüktür. Bu seçeneği yalnızca gerektiğinde kullanın.

AN -LIK GÖRÜNTÜ

Bir işlemdeki herhangi bir deyim tarafından okunan verilerin, işlemin başlangıcında var olan verilerin işlem açısından tutarlı sürümü olduğunu belirtir. İşlem yalnızca işlem başlamadan önce işlenen veri değişikliklerini tanıyabilir. Geçerli işlem başladıktan sonra diğer işlemler tarafından yapılan veri değişiklikleri, geçerli işlemde yürütülen deyimler tarafından görülemez. Bunun etkisi, bir işlemdeki deyimlerin, işlemin başlangıcında olduğu gibi işlenen verilerin anlık görüntüsünü alması gibidir.

Bir veritabanı kurtarılırken işlemler, SNAPSHOT verileri okurken kilit isteğinde bulunmaz. SNAPSHOT verileri okuyan işlemler, diğer işlemlerin veri yazmalarını engellemez. Veri yazan işlemler, işlemlerin verileri okumalarını engellemez SNAPSHOT .

Veritabanı kurtarma işleminin geri alma aşamasında, SNAPSHOT geri alınan başka bir işlem tarafından kilitlenen verileri okuma girişiminde bulunulması durumunda işlemler kilit isteğinde bulunur. İşlem SNAPSHOT geri alınana kadar işlem engellenir. Kilit, verildikten hemen sonra serbest bırakılır.

ALLOW_SNAPSHOT_ISOLATION Yalıtım düzeyini kullanan bir işlemi başlatabilmeniz için ON önce veritabanı seçeneğinin SNAPSHOT olarak ayarlanması gerekir. Yalıtım düzeyini kullanan SNAPSHOT bir işlem birden çok veritabanındaki verilere erişiyorsa, ALLOW_SNAPSHOT_ISOLATION her veritabanında olarak ON ayarlanmalıdır.

bir işlem, başka bir yalıtım düzeyiyle başlayan yalıtım düzeyine SNAPSHOT ayarlanamaz; bunu yapmak işlemin durdurulmasına neden olur. Bir işlem yalıtım düzeyinde başlatılırsa SNAPSHOT , bunu başka bir yalıtım düzeyiyle değiştirebilir ve sonra öğesine geri dönebilirsiniz SNAPSHOT. bir işlem verilere ilk kez eriştiğinde başlar.

Yalıtım düzeyi altında SNAPSHOT çalışan bir işlem, bu işlem tarafından yapılan değişiklikleri görüntüleyebilir. Örneğin, işlem bir tabloda bir UPDATE gerçekleştirir ve sonra aynı tabloda bir SELECT deyim yayınlarsa, değiştirilen veriler sonuç kümesine eklenir.

Uyarı

Anlık görüntü yalıtım modu altında, bir işlemdeki herhangi bir deyim tarafından okunan FILESTREAM verileri, deyiminin başında değil, işlemin başlangıcında var olan verilerin işlem açısından tutarlı sürümüdür.

SERİLEŞTİRİLEBİLİR

Aşağıdaki koşulları belirtir:

  • Deyimler değiştirilmiş ancak henüz diğer işlemler tarafından işlenmemiş verileri okuyamaz.

  • Geçerli işlem tamamlanana kadar geçerli işlem tarafından okunan verileri başka hiçbir işlem değiştiremez.

  • Diğer işlemler, geçerli işlem tamamlanana kadar geçerli işlemdeki herhangi bir deyim tarafından okunan anahtar aralığında yer alan anahtar değerlerine sahip yeni satırlar ekleyemez.

Aralık kilitleri, bir işlemde yürütülen her deyimin arama koşullarıyla eşleşen anahtar değerleri aralığına yerleştirilir. Bu, diğer işlemlerin geçerli işlem tarafından yürütülen deyimlerden herhangi biri için uygun olan satırları güncelleştirmesini veya eklemesini engeller. Bu, bir işlemdeki deyimlerden herhangi biri ikinci kez yürütülürse aynı satır kümesini okuduğu anlamına gelir. İşlem tamamlanana kadar aralık kilitleri tutulur. Bu, tüm anahtar aralıklarını kilitlediğinden ve işlem tamamlanana kadar kilitleri tuttuğundan yalıtım düzeylerinin en kısıtlayıcı değeridir. Eşzamanlılık daha düşük olduğundan, bu seçeneği yalnızca gerektiğinde kullanın. Bu seçenek, bir işlemdeki tüm deyimlerdeki tüm HOLDLOCK tablolarda ayar yapmakla SELECT aynı etkiye sahiptir.

Açıklamalar

Yalıtım düzeyi seçeneklerinden yalnızca biri aynı anda ayarlanabilir ve açıkça değiştirilene kadar bu bağlantı için ayarlanmış olarak kalır. bir deyiminin yan tümcesindeki FROM bir tablo ipucu bir tablo için farklı kilitleme veya sürüm oluşturma davranışı belirtmediği sürece, işlem içinde gerçekleştirilen tüm okuma işlemleri belirtilen yalıtım düzeyi için kurallar altında çalışır.

İşlem yalıtım düzeyleri, okuma işlemlerinde alınan kilitlerin türünü tanımlar. Veya için READ COMMITTEDREPEATABLE READ alınan paylaşılan kilitler genellikle satır kilitleridir, ancak okuma tarafından sayfa veya tablodaki satırların önemli bir sayısına başvurulsa satır kilitleri sayfaya veya tablo kilitlerine yükseltilebilir. İşlem okunduktan sonra bir satırı değiştirirse, işlem bu satırı korumak için özel bir kilit alır ve işlem tamamlanana kadar özel kullanım kilidi korunur. Örneğin, bir REPEATABLE READ işlemin satırda paylaşılan kilidi varsa ve işlem satırı değiştirirse, paylaşılan satır kilidi özel satır kilidine dönüştürülür.

Bir özel durum dışında, bir işlem sırasında istediğiniz zaman bir yalıtım düzeyinden diğerine geçebilirsiniz. Herhangi bir yalıtım düzeyinden yalıtıma SNAPSHOT geçiş yapılırken özel durum oluşur. Bunu yapmak işlemin başarısız olmasına ve geri alınmasına neden olur. Ancak, yalıtımda SNAPSHOT başlatılan bir işlemi başka bir yalıtım düzeyine değiştirebilirsiniz.

Bir işlemi bir yalıtım düzeyinden diğerine değiştirdiğinizde, değişiklikten sonra okunan kaynaklar yeni düzeyin kurallarına göre korunur. Değişiklik öncesinde okunan kaynaklar önceki düzeyin kurallarına göre korunmaya devam eder. Örneğin, bir işlem olarak READ COMMITTEDSERIALIZABLEdeğiştirilirse, değişiklikten sonra alınan paylaşılan kilitler artık işlemin sonuna kadar tutulur.

Saklı yordamda veya tetikleyicide sorun oluşturursanız SET TRANSACTION ISOLATION LEVEL , nesne döndürdüğünde yalıtım düzeyi nesne çağrıldığında etkin olan düzeye sıfırlanır. Örneğin, bir toplu işlemde ayarlarsanız REPEATABLE READ ve toplu işlem yalıtım düzeyini SERIALIZABLEolarak ayarlayan bir saklı yordamı çağırırsa, saklı yordam denetimi toplu işleme döndürdüğünde yalıtım düzeyi ayarı geri döner REPEATABLE READ .

Uyarı

Kullanıcı tanımlı işlevler ve ortak dil çalışma zamanı (CLR) kullanıcı tanımlı türler yürütemez SET TRANSACTION ISOLATION LEVEL. Ancak, bir tablo ipucu kullanarak yalıtım düzeyini geçersiz kılabilirsiniz. Daha fazla bilgi için bkz. Tablo İpuçları (Transact-SQL).

İki oturumu bağlamak için kullandığınızda sp_bindsession , her oturum yalıtım düzeyi ayarını korur. Bir SET TRANSACTION ISOLATION LEVEL oturumun yalıtım düzeyi ayarını değiştirmek için kullanılması, buna bağlı diğer oturumların ayarını etkilemez.

SET TRANSACTION ISOLATION LEVEL , ayrıştırma zamanında değil yürütme veya çalışma zamanında etkinleşir.

Yığınlar üzerinde en iyi duruma getirilmiş toplu yükleme işlemleri, aşağıdaki yalıtım düzeyleri altında çalışan sorguları engeller:

  • SNAPSHOT
  • READ UNCOMMITTED
  • READ COMMITTED satır sürümü oluşturma kullanma

Buna karşılık, bu yalıtım düzeyleri altında çalışan sorgular yığınlarda iyileştirilmiş toplu yükleme işlemlerini engeller. Toplu yükleme işlemleri hakkında daha fazla bilgi için bkz. Verileri Toplu İçeri ve Dışarı Aktarma (SQL Server).

FILESTREAM özellikli veritabanları aşağıdaki işlem yalıtım düzeylerini destekler.

Yalıtım düzeyi erişimi Transact-SQL Dosya sistemi erişimi
Okunmamış okuma SQL Server Desteklenmeyen
Okundu SQL Server SQL Server
Yinelenebilir okuma SQL Server Desteklenmeyen
Serileştirilebilir SQL Server Desteklenmeyen
Kaydedilmiş anlık görüntüyü okuma SQL Server SQL Server
Snapshot SQL Server SQL Server

Örnekler

Aşağıdaki örnek, oturum için öğesini TRANSACTION ISOLATION LEVEL ayarlar. Aşağıdaki her Transact-SQL deyimi için SQL Server, işlemin sonuna kadar tüm paylaşılan kilitleri tutar.

USE AdventureWorks2022;
GO

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
GO

BEGIN TRANSACTION;
GO

SELECT *
FROM HumanResources.EmployeePayHistory;
GO

SELECT *
FROM HumanResources.Department;
GO

COMMIT TRANSACTION;
GO