Kayıt noktası ayarlaması gereken bir saklı yordamım var, böylece belirli koşullar altında yaptığı her şeyi geri alabilir ve arayana bir hata kodu verebilir veya kabul et/taahhüt et ve arayana başarıyı geri ver. Ama arayanın zaten bir işlem başlatıp açmadığını çalışmak için ona ihtiyacım var. Bu konuda doktor çok kafa karıştırıcı. İşte bence işe yarayacak, ama tüm sonuçlardan emin değilim.SAVE TRANSACTION vs BEGIN TRANSACTION (SQL Server) işlemlerin nasıl güzelce yuvalanacağı
Sorun şu ki - bu Stored Procedure (SP)
başkaları tarafından çağırıldı. Bu yüzden, bir işlemi başlatıp başlamadıklarını bilmiyorum ... SP'mi kullanmak için bir işlem başlatması için kullanıcılara ihtiyaç duyarsam bile, Save Points
SP, bir işlemin devam edip etmediğini sınar ve eğer değilse BEGIN TRANSACTION
ile bir tane başlatır. Bir işlem devam ediyorsa, bunun yerine SAVE TRANSACTION MySavePointName
ile bir kayıt noktası oluşturacak ve yaptığım şey budur.
Daha sonra değişiklikleri geri almak zorunda kalırsam, daha önce BEGIN TRANSACTION
yapsaydım, ROLLBACK TRANSACTION
olur. Eğer kaydetme noktasını yapsaydım, o zaman ROLLBACK TRANSACTION MySavePointName
. Bu senaryo harika çalışıyor.
Burada biraz kafam karıştı - eğer yaptığım işi sürdürmek istersem, bir işlem başlatırsam COMMIT TRANSACTION
'u çalıştırırım. Ama eğer bir tasarruf noktası yaratsaydım? Ben COMMIT TRANSACTION MySavePointName
çalıştı, ancak daha sonra arayanın kendi hareketi tamamlamak için çalışır ve bir hata alır: Yani
The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.
Sonra merak ediyorum - bir tasarruf noktası geri alınmasını (çalışır: ROLLBACK TRANSACTION MySavePointName
arayanın en geri almak DEĞİL olacaktır işlem). Ama belki de hiç kimse "işlemek" zorunda değil mi? Sadece orada kalıyor, geri dönmeniz gerekiyor, ancak orijinal işlem gerçekleştiğinde (veya geri döndüğünde) kayboluyor mu?
Bir işlemi "yerleştirmek" için "daha iyi" bir yol varsa, lütfen biraz ışık da verin. BEGIN TRANSACTION
ile nasıl iç içe geçeceğimi anlayamadım, ancak sadece içsel işlemlerimi geri almamı ya da taahhüt etmem. ROLLBACK
, her zaman en üstteki işleme geri döner, COMMIT
ise @@trancount
değerini azaltır.
Kişisel bulmak bir cevap olarak gönderme değebilir. –
@Andriy Ok, yaptığım buydu - düzenlememi kaldırdım ve bunun yerine bir yanıt olarak kullandı. Teşekkürler. –