טרנזקציות – מה לא ידעתי עד כה?

יום רביעי, אוקטובר 6, 2010

אתמול במפגש ISUG, גיא גלנצר ממדירה הירצה בין היתר על טרנזקציות, תחום שלתומי חשבתי שהכל בו פשוט ומוכר, והתברר שאין זה כך.. למשל הקוד הבא- פותחים טרנזקציה ראשית, מעדכנים טבלה, פותחים טרנזקציה משנית, מעדכנים טבלה, מבצעים Commit לטרנזקציה המשנית, ו-RollBack לראשית: Use tempdb; Go IF Object_Id('T_Trn','U') Is Not Null Drop Table T_Trn; Go Create Table T_Trn(I Int); Go Begin Tran Tr1; Go Insert Into T_Trn Values(1); Go Begin Tran Tr2; Go Insert Into T_Trn Values(2); Go Commit Tran Tr2; Go Rollback; Go Select * From T_Trn; Go האם ה-Commit הראשון שומר "באופן בלתי הפיך" את הערך 2 או שמא זה לא נגמר עד שהגברת מתחילה לשיר ומתבצע ה-Commit הסופי על הכל? 1. אם בסוף מתבצע Rollback- מתבטל כל מה שנעשה במהלך הטרנזקציה...

טרנזקציות, שגיאות ושגרות שגיאה: השימוש באופציית Xact_Abort ובפונקציה Xact_State

יום שני, אוגוסט 23, 2010

האופציה Xact_Abort מגדירה אם בשעת שגיאה לעצור את הריצה ולבצע Rollback לטרנזקציה (On) או לא (Off), כאשר האופציה השניה היא ברירת המחדל. הפונקציה Xact_State קובעת האם יש טרנזקציה פתוחה (1) או אין טרנזקציה פתוחה (0); וכן האם יש טרנזקציה פתוחה שלא ניתן לבצע לה Commit אלא רק Rollback בשל שגיאה (1-). דוגמה 1 – ניצור טבלה עם Primary Key (אסור להכניס ערכים כפולים), ונראה מה קורה במקרה של Xact_Abort Off (ברירת החמדל): Use tempdb; Go If Object_Id('T','U') Is Not Null Drop Table T; Go Create Table T(A Int Not Null Primary Key); Go Set Xact_Abort Off;--ברירת מחדל Select 1 N, 'Before...