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.