2010-10-08 18 views
5

Sorunun durumunu yeniden oluşturmaya çalıştım [1]. masa, alınan ve eklentiyi site verilerle dolu "İzolasyon (veritabanı sistemleri)" OnSQL Server'da kilitleme davranışını anlama

[2] SQL Server 2008 R2 ssms içinde
, ben idam:

1) ilk giren ilk sekmede (pencere) ikinci pencerede hemen sonra SSMS

-- transaction isolation level in first window does not influence results (?) 
-- initially I thought that second transaction in 2) runs at the level set in first window 

begin transaction 
INSERT INTO users VALUES (3, 'Bob', 27) 
waitfor delay '00:00:22' 
rollback 

2), bir

-- this is what I commented/uncommented 

-- set transaction isolation level SERIALIZABLE 
-- set transaction isolation level READ REPEATABLE 
-- set transaction isolation level READ COMMITTED 
-- set transaction isolation level READ UNCOMMITTED 

SELECT * FROM users --WITH(NOLOCK) 

Güncellenme:
Üzgünüm, sonuçlar düzeltildi.

Benim sonuçları, 2 bölgesinde yer yalıtım düzeyine) bağlı SEÇ döndüren şunlardır: hemen

  • (NOLOCK

  • ile SELECT'in tüm durumlar için

    • ) kararsız sokulan satır okuma READ UNCOMMITTED için
    • (NOLOCK ile ya da NOLOCK ile SELECT)
  • işlemin 1 tamamlanmasını) (SADECE IF SEÇ NOLOCK olmadan) ve READ İŞLENEN ve üstü (YİNELENEBİLİR OKU), SERIALIZABLE hareket yalıtım düzeyi

Bunlar içinde

+0

yerleştirme işlemi için yalıtım düzeyi 2 işlem hiç gördüğünü etkilemez. İkinci işleminizin "READ UNCOMMITTED" seviyesinin altında çalışmadığından emin misiniz? –

cevap

2

yararlı bir MSDN sizin örnekte 2008 tablolarınızı kilitleri aleyhine SQL Server onun bir dava Belki SQL 2008'de ipuçları kilitleme hakkında onu konuşuluyor bağlantısını nedir?

işlem yalıtım düzeyi SERIALIZABLE olarak ayarlanırsa, aşağıdaki örnekte gösterildiği gibi

ve tablo düzeyinde kilitleme (potansiyel olarak SQL Server 2008 tarafından ingored kilitlerin ilgili görüşmelerin aşağıdaki bağlantıdan şu pasajı) ipucu nolock deyim ile kullanılan, genellikle serileştirilebilir işlemleri korumak için kullanılan anahtar menzilli kilitler alınmamaktadır.

CopyUSE AdventureWorks2008R2; 
GO 
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; 
GO 
BEGIN TRANSACTION; 
GO 
SELECT Title 
    FROM HumanResources.Employee WITH (NOLOCK); 
GO 

-- Get information about the locks held by 
-- the transaction. 
SELECT 
     resource_type, 
     resource_subtype, 
     request_mode 
    FROM sys.dm_tran_locks 
    WHERE request_session_id = @@spid; 

-- End the transaction. 
ROLLBACK; 
GO 

sadece kilit

referanslar HumanResources.Employee şema stabilite (Sch-S) kilit olduğu alınır. Bu durumda, serilerştirilebirlik artık garantilidir. SQL Server 2008 yılında

A LTER TABLO LOCK_ESCALATION seçeneği disfavor masa kilitler ve bölümlenmiş tablolarda HoBT kilitleri etkinleştirebilirsiniz. Bu seçenek kilitleme ipucu değildir, ancak kilit artışını azaltmak için kullanılabilir. Daha fazla bilgi için bkz. ALTER TABLE (Transact-SQL).

+0

Bu sadece orijinal işlem bir "SELECT" –

+0

@Martin yapıyorsa, alakadar olur - teşekkürler, kendimden emin değildim ama yine de göndermeye değer olduğunu hissettim. – kevchadders

+0

teşekkürler! Bu alandaki çelişkili tartışmalarda boğuldum, sadece diğer RDBMS'de (Oracle, PostGreSQL, vb.) Kilitleme referansları bulundu. Şimdi anahtar sözcük "(Sch-S) kilidi ile" Aramalarda doğru yoldayım. WTF, aynı kilitler, aynı kavramları açıklayan farklı DBMS'de farklı olarak adlandırılır ... –

1

ikinci sorgu ipucu hareket yalıtım seviyesi geçersiz kılar.
SELECT ... WITH (NOLOCK)SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT ... temelde aynıdır. kilitleri ilki tarafından serbest kadar ikinci işlem bekler böylece kilitler onur başka yalıtım düzeyi ile

.