MSSQL'de çok uzun süre açık bir işlem yapmanın etkisi nedir?


11

Sadece bir DB'de bir işleme başlar ve işlemeyi veya geri almayı unutursanız ne olacağını merak ediyorum. Sunucu kapalı mı olacak? Diyelim ki 3 günlüğüne bıraktın.

Diğer kullanıcıların kapatılmamış bir işlem olduğunu bilmediğini varsayarak bunu kullanan kullanıcılar da vardır (sadece kullanıcıların veritabanına veri eklediğini varsayalım). Bu eylemin sonuçları nelerdir?

Yanıtlar:


14

Kendi başına açık bir işlem yapmanın neredeyse hiçbir sonucu olmayacaktır. Basit

BEGIN TRANSACTION
-- wait for a while, doing nothing
-- wait a bit longer
COMMIT

en kötü ihtimalle birkaç bayt durum değeri tutacaktır. Önemli değil.

Çoğu program işlem içinde gerçek işler yapar ve bu başka bir konudur. Bir işlemin amacı, aynı veritabanına eşzamanlı olarak yazan diğer kullanıcılar olmasına rağmen, veritabanındaki birkaç olgunun aynı anda doğru olduğundan emin olabilirsiniz.

Banka hesapları arasında para transfer etmenin standart örneğini ele alalım. Sistem, kaynak hesabın var olduğundan, yeterli paraya sahip olduğundan, hedef hesabın bulunduğundan ve hem borç hem de kredinin gerçekleştiğinden ya da hiçbirinin gerçekleşmediğinden emin olmalıdır. Belki de bu iki hesap arasında bile başka işlemler gerçekleşirken bunu garanti etmelidir. Sistem , ilgili tablolara kilit alarak bunu sağlar . Hangi kilitlerin alındığı ve diğer insanların çalışmalarının ne kadarını gördüğünüz, işlem yalıtım düzeyi tarafından denetlenir .

Çok fazla iş yaparsanız, kilitleri tuttuğunuz nesneleri beklerken diğer işlemlerin kuyruğa girmesi iyi bir şanstır. Bu, sistemin genel verimini azaltacaktır. Sonunda zaman aşımı sınırlarına ulaşırlar ve başarısız olurlar, bu da genel sistem davranışı için bir sorundur. İyimser bir yalıtım düzeyi kullanırsanız, bir başkasının işi nedeniyle bir taahhütte bulunduğunuzda işleminiz başarısız olabilir.

Kilitlerin tutulması sistem kaynaklarını gerektirir. Bu, sistemin diğer istekleri işlemek için kullanamayacağı ve verimi azaltacağı bir bellektir.

Çok fazla iş yapılmışsa, sistem kilit yükseltme işlemini gerçekleştirmeyi seçebilir . Tek tek satırları kilitlemek yerine tüm tablo kilitlenecektir. Daha sonra eşzamanlı kullanıcılar etkilenecek, sistem verimi daha da düşecek ve uygulama etkisi daha büyük olacaktır.

Veri değişiklikleri, onları koruyan kilitler gibi günlük dosyasına yazılır. İşlem gerçekleşene kadar bunlar günlükten silinemez. Bu nedenle çok uzun işlem, ilişkili dosyalarda günlük dosyası şişmesine neden olabilir.

Mevcut iş büyük iş yükleri için olası tempdb kullanıyorsa, oradaki kaynaklar işlemin sonuna kadar bağlanabilir. Aşırı durumlarda bu, başka görevlerin başarısız olmasına neden olabilir, çünkü artık onlar için yeterli yer yoktur. Raporun SORT için yeterli disk kalmadı ve rapor başarısız oldu bu yüzden kötü kodlanmış bir UPDATE dolu tempdb dolu vakaları oldu.

İşlemi GERİ ALMA seçeneğini seçerseniz veya sistem başarısız olursa ve kurtarılırsa, sistemin yeniden kullanılabilir hale gelmesi için geçen süre ne kadar işin gerçekleştirildiğine bağlı olacaktır. Bir işlemin açık olması iyileşme süresini etkilemez, ne kadar iş yapıldığıdır. İşlem açık, ancak bir saat boyunca boşta kalsaydı, neredeyse anlık olacaktır. O saat boyunca sürekli yazıyorsa, temel kural, iyileşme süresinin de yaklaşık bir saat olacağıdır.

Gördüğünüz gibi uzun işlem sorunlu olabilir. OLTP sistemleri için en iyi uygulama, ticari işlem başına bir veritabanı işlemine sahip olmaktır. Sık işlenen bloklar halinde toplu iş süreci girişi ve kodlanmış yeniden başlatma mantığı için. Genellikle tek bir DB işlemi içinde birkaç bin kayıt işlenebilir, ancak bu eşzamanlılık açısından test edilmeli ve tüketimi yeniden kaynaklandırmalıdır.

Diğer uç noktaya gidip işlemlerden ve kilitlerden tamamen kaçınmak için cazip olmayın. Verilerinizde tutarlılığı sağlamanız gerekiyorsa (ve neden başka bir veritabanı kullanıyorsunuz?) Yalıtım düzeyleri ve işlemleri çok önemli bir amaca hizmet eder. Seçenekleriniz hakkında bilgi edinin ve uygulamanızın her bir bölümü için hangi eşzamanlılık ve doğruluk dengesini yaşamaya hazır olduğunuza karar verin.


üç gün boyunca açık olsa bile?
JanLeeYu

Evet, üç gün boyunca bile. Önemli olan sadece ne kadar süredir açık olduğu değil, TX açıkken yapılan iş miktarıdır. Tabii ki bir DBA olarak, işlem sahibine neden bu kadar uzun süre açık olmaları gerektiğini sormak isteyebilirsiniz. Bir DBA ekibini yönettiğimde 30 dakikadan fazla süredir açık olan ve sahibiyle sohbet eden tüm TX'leri kaydettim.
Michael Green

TAMAM. Büyük açıklama için teşekkürler. Gerçi herkes de başarılı oldu.
JanLeeYu

Ne rahatlama ... Cevap için tekrar teşekkürler.
JanLeeYu

"Kötü kodlanmış GÜNCELLEME" Evet. Bunu gördüm. Bir döngü içinde bazı adları nitelendirmeyen ve 1 = 1 benzeri davranışla sonuçlanan bir güncelleme ifadesi, bu nedenle döngünün her yinelemesi için tüm tabloyu güncelledi (bu da satırların çoğuna yanlış veriler de ekledi).
jpmc26

6

En büyük sonucunuz işlemde kullanılan nesnelerin engellenmesi olacaktır. Özellikle kullanıcılarınızın veri eklediğini varsayarsanız, bu uzun süren işlem sık kullanılan tablolarda SELECT ifadeleri içerebilir. Kullanıcılarınızın güncelleme bildirimleri, güncellemelerini veya eklemelerini tamamlamak için gereken kilidi alamayabilir.

Olabilecek ikincil bir şey, günlük dosyası etkinliğidir; büyük bir veri kümesini güncellüyorsanız, günlüğün işlemin kullandığı kısmı söz konusu işlem süresince etkin tutulur. İşlem tamamlanana veya geri alınana kadar günlüğün bu bölümünü yeniden kullanamazsınız. Çok aktif bir OLTP sisteminde olabileceğiniz senaryolarda bu, günlük dosyanızın hızlı bir şekilde büyümesine ve depolama cihazınızı doldurmasına neden olabilir.


örneğin, işlemi oluşturan kişinin sunucuyla olan bağlantısı kesilirse, işlemi kapatmak için sunucuda tekrar oturum açabilir mi?
JanLeeYu

İşlem, MSDTC kullanılan bir ortamda olsaydı, artık bir işlem olabilir. Bu durumda, hiçbir kullanıcı artık kendisini kapatamayacaktı ... DBA bununla başa çıkmak zorunda kalacaktı. Bunun dışında, genellikle bağlantı kesildiğinde işlemin SQL Server tarafından iptal edildiğini görmelisiniz ... ancak yine de her zaman böyle olmayabilecek büyük işlemlerde.

Böyle bir durumda, yönetici yine de işlemi kapatabilir mi?
JanLeeYu

Buna cevap veremem, hepsi değişiyor. Sunucunun yeniden başlatılması gereken durumlar vardı ya da örnek ikincil düğüm / çoğaltma için başarısız oldu.

4

Eksik işlem çok sayıda kilit tutabilir ve engellemeye neden olabilir

Bir işlem zaman aşımına uğradığı için veya işlemin tamamlanması için bir COMMIT veya ROLLBACK deyimi verilmeden toplu işlem iptal edildiğinden işlem tamamlanmadığında, işlem açık bırakılır ve bu işlem sırasında edinilen tüm kilitler devam eder yapılacak. Aynı bağlantı altında yapılan sonraki işlemler iç içe işlemler olarak değerlendirilir, bu nedenle bu tamamlanan işlemlerde edinilen tüm kilitler serbest bırakılmaz. Bu sorun, bir ROLLBACK yürütülene kadar aynı bağlantıdan yürütülen tüm işlemlerde tekrarlanır. Sonuç olarak, çok sayıda kilit tutulur, kullanıcılar engellenir ve işlemler kaybolur, bu da beklediğinizden farklı verilerle sonuçlanır.

kaynak


örneğin, işlemi oluşturan kişinin sunucuyla olan bağlantısı kesilirse, işlemi kapatmak için sunucuda tekrar oturum açabilir mi?
JanLeeYu

SQL Server bağlantının kaybedildiğini bildikten sonra işlemi geri alır. Buraya bakın dba.stackexchange.com/questions/47404/… . Aynı kullanıcı yeniden bağlanırsa, farklı bir oturum olur, bu nedenle bir şekilde eski işlemi "kabul edemez".
Michael Green
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.