Her zaman bir işlem oluşturmak için kötü bir uygulama mı?
Burada hangi bağlamda konuştuğunuza bağlı. Bu bir güncelleme ise, TRANSACTIONS'ı açık bir şekilde kullanmanızı şiddetle tavsiye ederim. Bir SELECT ise, HAYIR (açıkça).
Ama önce anlamak için daha çok şey var: sql sunucusundaki her şey bir işlemde var.
Oturumu seçeneği ne zaman IMPLICIT_TRANSACTIONS
olduğunu OFF
ve açıkça belirtmek begin tran
ve commit/rollback
sonra bu yaygın bir şekilde bilinmektedir Açık İşlem . Aksi takdirde bir autocommit işlemi alırsınız.
Ne zaman IMPLICIT_TRANSACTIONS
olduğunu ON
bir örtük işlem kitapları çevrimiçi makalesinde (örn belgelenen deyimi türlerinden birini infaz otomatik olarak başlatılan SELECT
/ UPDATE
/ CREATE
) ve işlenen veya açıkça geri alınması gerekmektedir. Bir yürütme BEGIN TRAN
artırmak istiyorum bu modda @@TRANCOUNT
ve başka bir "iç içe" hareketi başlatmak)
Hangi modu kullandığınızı değiştirmek için,
SET IMPLICIT_TRANSACTIONS ON
veya
SET IMPLICIT_TRANSACTIONS OFF
select @@OPTIONS & 2
Yukarıdaki 2 döndürürse, gizli işlem modunda demektir. 0 döndürürse, autocommit'tesiniz.
Gerçekten gerekli olmadığında işlem yaratmanın maliyeti nedir?
Veritabanını bir tutarlı durumdan başka bir tutarlı duruma almak için işlem yapılması gerekir. İşlemlere alternatif olmadığından işlemlerin maliyeti yoktur. Bakınız: Satır Sürüm Oluşturma Tabanlı Yalıtım Düzeylerini Kullanma
Bir izolasyon seviyesi kullanıyor olsanız bile read_uncomitted. Kötü bir uygulama mı? çünkü kilitlemeyle ilgili sorun yaşamamalıdır.
READ_UNCOMMITED izolasyon seviyesi, tanımlara göre kirli okumalara izin verir, yani bir işlem diğer işlemler tarafından yapılan taahüt edilmemiş değişiklikleri görebilecek. Bu izolasyon seviyesinin yaptığı şey, veritabanının eşzamanlılığını korumak için kilitleme yönteminin kilitleme başının üstünü gevşetmesidir.
Bunu diğer sorguları etkilemeyecek şekilde bir bağlantı / sorgu düzeyinde kullanabilirsiniz.
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
Jeff Atwood'un Yemek Filozofları Yapbozuna Bağlı Deadlock'ları tanımlayan ve okunan anlık görüntü yalıtım seviyesini anlatan ilginç bir makale buldu .
DÜZENLE:
Meraktan, T-log üzerindeki etkisini ölçmek için Log Bytes Flushed / Sec, Log Flush Waits / Sn (LOG flushed beklemekte olan komisyon sayısı) gibi Perfmon sayaçları ile bazı grafikler çizdim:
basit kod :
create table testTran (id int, Name varchar(8))
go
-- 19 sec
-- Autocommit transaction
declare @i int
set @i = 0
while @i < 100000
begin
insert into testTran values (1,'Kin Shah')
set @i = @i+1
end
---------------------------------------------------
-- 2 sec
-- Implicit transaction
SET IMPLICIT_TRANSACTIONS ON
declare @i int
set @i = 0
while @i < 100000
begin
insert into testTran values (1,'Kin Shah')
set @i = @i+1
end
COMMIT;
SET IMPLICIT_TRANSACTIONS OFF
----------------------------------------------------
-- 2 sec
-- Explicit transaction
declare @i int
set @i = 0
BEGIN TRAN
WHILE @i < 100000
Begin
INSERT INTO testTran values (1,'Kin Shah')
set @i = @i+1
End
COMMIT TRAN
Autocommit İşlemleri : (@TravisGan tarafından vurgulandığı şekilde düzenlendi)
- Ekleme 19 saniye sürdü.
- Her Autocommit, autocomit nedeniyle T-log tamponunu diske aktaracaktır (@TravisGan vurgulandıktan sonra ve bahsettiğimi kaçırdım).
- CHECKPOINT işlemi hızlı bir şekilde tamamlanacaktır, çünkü temizlenmesi gereken kirli günlük arabellek miktarı sıkça sessizce çalıştığından daha az olacaktır.
UYGULAMA & Açık İşlem:
- Ekleme 2 saniye sürdü.
- EXPLICIT işlemi için kayıt arabellekleri yalnızca dolu olduklarında temizlenir.
- Autocommit işleminin aksine, EXPLICIT işleminde, CHECKPOINT işleminin temizlenmesi için daha fazla günlük arabelleği olacağından daha uzun sürecektir (günlük arabelleği yalnızca dolu olduklarında temizlendi).
Veritabanı düzeyinde İşlemler hakkında bilgi döndürecek bir DMV sys.dm_tran_database_transactions var.
Açıkçası, bu etkiyi göstermek için daha basit bir testtir. Disk alt sistemi, otomatik veritabanı büyüme ayarları, veritabanının ilk boyutu, aynı sunucuda çalışan diğer işlemler \ veritabanı, vb. Gibi diğer faktörlerin de etkisi olacaktır.
Yukarıdaki testlerden, Kapalı ve Açık işlemler arasında bir fark yoktur.
@TravisGan'a cevabınıza daha fazla şey eklemenize yardımcı olduğun için teşekkürler
BEGIN TRAN SELECT ... COMMIT
sadece vsSELECT
orada görünen bir olmak son derece küçük performans farkı.