טרנזקציות מקוננות

05/03/2011

אין תגובות

כל מי שעובד עם טרנזקציות מפורשות – אמור לדעת שבטרנזקציות אין קינון אמיתי. כלומר- אם בתוך טרנזקציה נפתח טרנזקציה חדשה, כל עוד לא התבצע ה-Commit האחרון – שום דבר לא נשמר באמת, ואם נבצע Rollback – הוא "יפיל" את כל הטרנזקציות.

למשל- קורה שמפעילים פרוצדורה שבתוכה נפתחת טרנזקציה, במהלך הריצה היא מפעילה פרוצדורת משנה שגם פותחת טרנזקציה וכך הלאה; אך מכל בחינה מעשית יש רק טרנזקציה אחת פתוחה כל הזמן, למרות שלכאורה יש קינון של זו בתוך זו.

דוגמה – ניצור פרוצדורה שמבצעת פעולה כלשהי, פותחת טרנזקציה, מבצעת עוד פעולה, פותחת עוד טרנזקציה, מבצעת עוד פעולה ומסיימת (הפעולה תמיד תהיה שליפת פרטי הטרנזקציה הנוכחית בעזרת שליפות DMV אך מי שרוצה יכול להוסיף פעולות "אמיתיות" עמו הכנסת נתונים לטבלה):

If Object_id('tempdb..#P') Is Not Null Drop Proc #P;

Go

 

Create Procedure #P As

 

Select  R.transaction_id,

        T.name 

From sys.dm_exec_requests R 

Inner Join sys.dm_tran_active_transactions T

        On R.transaction_id=T.transaction_id

Where R.session_id=@@SPID;

 

Begin Tran MyTran1

 

Select  R.transaction_id,

        T.name 

From sys.dm_exec_requests R 

Inner Join sys.dm_tran_active_transactions T

        On R.transaction_id=T.transaction_id

Where R.session_id=@@SPID;

 

Begin Tran MyTran2

 

Select  R.transaction_id,

        T.name 

From sys.dm_exec_requests R 

Inner Join sys.dm_tran_active_transactions T

        On R.transaction_id=T.transaction_id

Where R.session_id=@@SPID;

 

Commit Tran MyTran3;

Commit Tran MyTran3;

Go

וכעת נפעיל אותה:

Exec #P;

Go

clip_image002

(מספרי הטרנזקציות משתנים מהרצה להרצה)

השליפה הראשונה הייתה טרנזקציה בודדה שנפתחה ונסגרה אוטומטית (ללא פקודות Begin Tran ו-Commit) ומספרה 14562947.

השליפות השניה והשלישית היו שתיהן בתוך אותה טרנזקציה 14562948, MyTran1 שנפתחה לפני השליפה השניה, וזאת למרות שבין השליפה השניה והשלישית נפתחה לכאורה טרנזקציה נוספת – MyTran2.

זאת ועוד- פקודות ה-Commit בסוף מתייחסות לטרנזקציה MyTran3 שלא הייתה ולא נבראה: המערכת מצפה לשתי פקודת Commit או לפקודת Rollback, ומבחינתה שנקרא להן איך שנרצה..

אגב- גם ל-Rollback ניתן להוסיף שם טרנזקציה למרות שהוא מפיל את כולן ללא הבדל שם, מין ומצב משפחתי.

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *