נושאים בביזור – Distributed Transaction באמצעות 2PC ו- 3PC

אחד ה- primitives העיקריים בעבודה עם DB-ים רלציוניים (ולא רק) זאת הטרנזקציה. טרנזקציה, היא אוסף של פעולות שמובטח לנו שכולן הצליחו להתבצע, או לחלופין שאף אחת מהן לא התבצעה. בואו נניח כעת שאנחנו רוצים לעשות טרנזקציה, שמערבת מס’ רכיבים, שכל אחד מהם בנפרד יודע לעשות טרנזקציה, ואנחנו רוצים לעשות טרנזקציה שכוללת פעולות מול כל אחד ואחד מהרכיבים הללו. למשל, נדמיין שרת Oracle ו- SQL Server (או שני שרתי SQL Server שונים), שאנחנו רוצים לעשות בכל אחד מהם בנפרד רצף פעולות כטרנזקציה.

איך לא עושים Distributed Transaction?

כדי להבין למה זה לא תרחיש טריוויאלי, נתבונן במימוש הנאיבי, ונראה כיצד הוא גורר תוצאה שגוייה במצבים מסוימים. נגדיר שיש לנו שרת A ושרת B. בואו נסתכל תחילה על המימוש הבא:

SERVER A: BEGIN TRANSACTION
  SERVER B: BEGIN TRANSACTION	
    SERVER A: UPDATE tblA SET Balance = 1 WHERE ID = 1
    SERVER B: UPDATE tblB SET Balance = 1 WHERE ID = 1
  SERVER B: COMMIT TRANSACTION
SERVER A: COMMIT TRANSACTION

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

להמשך קריאה

Entity Framework והטעויות שיגרמו לכם לבעיות ביצועים

בעשור האחרון, מרבית הפיתוח מול הדטאבייסים עושה שימוש ב- ORM-ים כאלה ואחרים. אחד ה- ORM-ים הפופולריים בעולם הדוטנט, הוא Entity Framework. בפוסט הזה, אסקור טעויות נפוצות שמשליכות על ביצועים של עבודה מול ה- DB בעבודה עם ORM-ים באופן כללי, ובפרט בעבודה עם Entity Framework.
כלל הדוגמאות בפוסט מבוססות על ה- DB של Stack Overflow, בגרסה שהתאמתי עבור הקורס SQL שהקלטתי בעבר. הדוגמאות מבוססות על Entity Framework 6.2, על אף שחלקן רלוונטיות לכל סוגי ה- ORM-ים.

טעות #1 : בעיית ה- N+1

בואו נניח שאנחנו רוצים להציג את כל השאלות ב- Stack Overflow, ולצד כל שאלה – מי המשתמש שכתב אותה. נסתכל בקוד הבא:

using (var data = new Entities())

{

    foreach (var question in data.Posts.Where(k=>k.Title != null))

    {

        Console.WriteLine($"{question.Title} was asked by {question.User.DisplayName}");

    }

}

ועכשיו נשאלת השאלה – כמה שליפות SQL רצו פה מול ה- DB?להמשך קריאה