דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. מניעת race condition ב-DB

מניעת race condition ב-DB

מתוזמן נעוץ נעול הועבר תכנות
42 פוסטים 7 כותבים 1.1k צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • A מנותק
    A מנותק
    avr416
    כתב ב נערך לאחרונה על ידי avr416
    #21

    לא הבנתי למה לא נעילה ברמת הקוד?
    גם את הנעילה הזאת אתה מקבל בחינם מהקוד..
    ולגופו של ענין, הרי אתה לא ניגש לdb מחוץ לקוד, אז אני לא רואה סיבה למה לא להשתמש בזה.
    אתה גם יכול לעשות נעילה בקוד פר ארגון, כך שלא יהיו לך הרבה התנגשויות.

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

    תגובה 1 תגובה אחרונה
    3
    • yossizY מנותק
      yossizY מנותק
      yossiz
      השיב לchagold ב נערך לאחרונה על ידי yossiz
      #22

      @chagold אבל הקוד הפנימי של ה-DB שמממש את זה לא זמין לנו המשתמשים.

      📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

      chagoldC תגובה 1 תגובה אחרונה
      0
      • chagoldC מנותק
        chagoldC מנותק
        chagold
        השיב לyossiz ב נערך לאחרונה על ידי
        #23

        @yossiz https://www.postgresql.org/docs/9.3/sourcerepo.html?

        yossizY תגובה 1 תגובה אחרונה
        0
        • yossizY מנותק
          yossizY מנותק
          yossiz
          השיב לchagold ב נערך לאחרונה על ידי
          #24

          @chagold אני יודע שקוד המקור של ה-DB זמין, אבל מה אני אעשה עם זה?
          אני לא הולך לערוך את הקוד ולקמפל כדי להוסיף אפשרות זו.

          📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

          תגובה 1 תגובה אחרונה
          3
          • chagoldC מנותק
            chagoldC מנותק
            chagold
            כתב ב נערך לאחרונה על ידי
            #25
            פוסט זה נמחק!
            תגובה 1 תגובה אחרונה
            0
            • yossizY מנותק
              yossizY מנותק
              yossiz
              השיב לyossiz ב נערך לאחרונה על ידי yossiz
              #26

              @yossiz אמר במניעת race condition ב-DB:

              1. לעשות את כל התהליך בפקודת SQL אחד.

              @dovid אמר במניעת race condition ב-DB:

              אני יודע שבSQL SERVER נכון להיום אתה מוגן ב4

              אתה בטוח בזה? יש לך מקור?

              @clickone אמר במניעת race condition ב-DB:

              לכאורה בשיטה הזו הוא ינעל את השינויים כי זה נעשה בפעם אחת

              מכיון שהנושא מאוד סקרן אותי והתחלתי לחשוש שזה לא נכון עשיתי נסיון,

              • יצרתי טבלה פשוטה:
              create table test (id  SERIAL, i INTEGER);
              

              ואז הרצתי בלולאה במקביל בשתי סשנים את הפקודה הזאת:

              INSERT INTO
                  test (i)
              VALUES
                  (
                      (SELECT max FROM (SELECT MAX(i) AS max, pg_sleep(1) FROM test) AS i) + 1
                  );
              

              (הוספתי את ה-pg_sleep כדי למקסם את הסיכויים להתנגשות)

              התוצאה היתה שהיו מספר שורות עם אותו מספר, בניגוד לצפיה שכל שורה תהיה מספר אחד מעל לשורה הקודמת, כלומר שהיה race condition.
              אח"כ שניתי את הפרמטרים של הקליינטים:

              SET default_transaction_isolation TO serializable;
              

              והרצתי את זה שוב, וחלק מהפעולות נכשלו בגלל התנגשויות

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

              אני חושש שזה המצב בכל המנועים ואם כן זו נקודה חשובה להיות מודע לזה.

              📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

              dovidD תגובה 1 תגובה אחרונה
              2
              • dovidD מנותק
                dovidD מנותק
                dovid ניהול
                השיב לyossiz ב נערך לאחרונה על ידי dovid
                #27

                @yossiz אמר במניעת race condition ב-DB:

                אתה בטוח בזה? יש לך מקור?

                כעת בדקתי, זה לא נכון (נוצר לי כפילות..) אז אני לא מחפש מקור 😞
                מהלינקים שהבאתי כבר למעלה עולה שחובה לעשות נעילה ברמת SERIALIZABLE בדיוק כפי שכתבת.
                יש פתרון פה לא הבנתי אותו, מריצים את זה באותו פקודה של ההכנסה?
                סתם ככה אשמח לדעת מה הרקע של הצורך.

                מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                בכל נושא אפשר ליצור קשר dovid@tchumim.com

                yossizY 2 תגובות תגובה אחרונה
                2
                • yossizY מנותק
                  yossizY מנותק
                  yossiz
                  השיב לdovid ב נערך לאחרונה על ידי yossiz
                  #28

                  @dovid אמר במניעת race condition ב-DB:

                  סתם ככה אשמח לדעת מה הרקע של הצורך.

                  אין באמת צורך כל כך חשוב, אבל אני שמח לדעת את הפתרון בלי קשר.
                  מדובר בטבלה של כסף שנכנס לארגון (תרומות), לצרכי תצוגה אנחנו רוצים לתת לכל charge מספר ידידותי במקום לזהות אותו על ידי ה-PK. לצורך תצוגה אנחנו מעדיפים שהמספרים של ה-charges של כל ארגון יהיו עוקפים. אנחנו רוצים גם שהמספרים יהיו קבועים, כלומר גם אם נמחק תרומה מאיזה סיבה זה לא אמור לשנות את כל המספרים.
                  האם זה סיבה מספקת להכריח נעילה על ה-DB לכל הכנסת תרומה? אני לא יודע... נחיה ונראה...

                  📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                  clickoneC תגובה 1 תגובה אחרונה
                  0
                  • yossizY מנותק
                    yossizY מנותק
                    yossiz
                    השיב לdovid ב נערך לאחרונה על ידי
                    #29

                    @dovid אמר במניעת race condition ב-DB:

                    יש פתרון פה לא הבנתי אותו, מריצים את זה באותו פקודה של ההכנסה?

                    גם אני לא הבנתי. כנראה שהעונה לא הבין את השאלה.

                    📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                    תגובה 1 תגובה אחרונה
                    0
                    • clickoneC מנותק
                      clickoneC מנותק
                      clickone
                      השיב לyossiz ב נערך לאחרונה על ידי
                      #30

                      @yossiz אמר במניעת race condition ב-DB:

                      אין באמת צורך כל כך חשוב

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

                      אין טסט כמו פרודקשן.

                      המייל שלי urivpn@gmail.com

                      תגובה 1 תגובה אחרונה
                      1
                      • מנצפךמ מנותק
                        מנצפךמ מנותק
                        מנצפך
                        כתב ב נערך לאחרונה על ידי
                        #31

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

                        אפשר להקצות את כל השרת רק לזה, אם אתה רוצה למנוע מצבים של עומס (כי זה תהליך אחד שעושה את כל הקבלות).

                        שאר הפתרונות שיש כאן הם ברמת הDB, ומשתנים ממנוע אחד למשנהו ואפילו מגירסה לגירסה.

                        yossizY תגובה 1 תגובה אחרונה
                        5
                        • yossizY מנותק
                          yossizY מנותק
                          yossiz
                          השיב למנצפך ב נערך לאחרונה על ידי yossiz
                          #32

                          @מנצפך תודה, הפתרון שלך דומה מאוד לפתרון 3 שהצעתי, רק שאני הצעתי להשתמש בשירות מובנה של ה-DB ואתה מציע לממש את זה בעצמי.

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

                          לעצם הפתרון, אחרי מחשבה אני תופס שלכאורה זה הפתרון הכי זול (מבחינת נעילות) שקיים. הנעילה תהיה רק על הפעולה שחייבת נעילה.

                          📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                          nigunN תגובה 1 תגובה אחרונה
                          1
                          • מנצפךמ מנותק
                            מנצפךמ מנותק
                            מנצפך
                            כתב ב נערך לאחרונה על ידי
                            #33

                            לא הבנתי על מה אתה מדבר? כי בפתרון שלי אין שום מימוש של נעילה

                            yossizY תגובה 1 תגובה אחרונה
                            0
                            • yossizY מנותק
                              yossizY מנותק
                              yossiz
                              השיב למנצפך ב נערך לאחרונה על ידי
                              #34

                              @מנצפך נכון, התכוונתי למצב שמגביל את הגישה לאחד אחד. זה שוה ערך לנעילה.

                              📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                              תגובה 1 תגובה אחרונה
                              0
                              • מנצפךמ מנותק
                                מנצפךמ מנותק
                                מנצפך
                                כתב ב נערך לאחרונה על ידי
                                #35

                                זה לא מגביל את הקליינט בשליחת בקשה כמובן. רק התשובה תתמהמה מעט.

                                תגובה 1 תגובה אחרונה
                                0
                                • nigunN מנותק
                                  nigunN מנותק
                                  nigun
                                  השיב לyossiz ב נערך לאחרונה על ידי
                                  #36

                                  @yossiz אמר במניעת race condition ב-DB:

                                  בל לעומת זה אני רואה חסרונות גם כן, ובפרט בפרוייקט בגודל זה (כלומר קטן מאוד כרגע) לא נראה לי ששוה לי ההשקעה.

                                  איזה חסרונות קיימים בנעילה בקוד?
                                  (באיזה שפה הקוד כתוב?)

                                  מייל: nigun@duck.com

                                  dovidD yossizY 2 תגובות תגובה אחרונה
                                  0
                                  • dovidD מנותק
                                    dovidD מנותק
                                    dovid ניהול
                                    השיב לnigun ב נערך לאחרונה על ידי
                                    #37

                                    @nigun בנעילה בקוד יש שתי בעיות:
                                    א. בתחזוקת הקוד לעולם צריך לזכור את האחריות הזאת
                                    ב. צריך לוודא שאין מצב של ריצה מקבילה של מופעים, אסור שהתוכנה תרוץ פעמיים.

                                    מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                                    בכל נושא אפשר ליצור קשר dovid@tchumim.com

                                    nigunN תגובה 1 תגובה אחרונה
                                    5
                                    • yossizY מנותק
                                      yossizY מנותק
                                      yossiz
                                      השיב לnigun ב נערך לאחרונה על ידי yossiz
                                      #38

                                      @nigun אני לא בטוח שיש שום חסרונות בנעילה בקוד. (עריכה: עיין מה שכתב דוד למעלה)
                                      זה nodejs.

                                      מה ש@מנצפך מציע הוא (אולי הרבה) יותר זול מנעילה בקוד.
                                      אבל מצד שני יש חסרון שכאשר מדובר בעשרות אלפי ארגונים וצריך לשמור מספר לכל אחד זה יתפוס משאבים. וגם, צריך לכתוב את זה בצורה נכונה שהמספרים תמיד יהיו מסונכרנים עם מה שיש ב-DB. (אני לא אומר שזה קשה, רק זה עוד חחתיכת קוד שצריך לוודא שהוא פועל נכון).
                                      אגב, @מנצפך חושב מאוד גדול... מכיון שכרגע הגישה ל-DB אצלי הוא רק על ידי תהליך אחד אין צורך בשרת נפרד שיעשה את זה, אלא אפשר לעשות את זה בתוך התהליך.

                                      📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                                      תגובה 1 תגובה אחרונה
                                      3
                                      • nigunN מנותק
                                        nigunN מנותק
                                        nigun
                                        השיב לdovid ב נערך לאחרונה על ידי
                                        #39

                                        @dovid אמר במניעת race condition ב-DB:

                                        ב. צריך לוודא שאין מצב של ריצה מקבילה של מופעים, אסור שהתוכנה תרוץ פעמיים.

                                        מה הבעיה? ריצה מקבילה של מספר מופעים באותו אפליקציה או ריצה של מספר אפליקציות?

                                        מייל: nigun@duck.com

                                        yossizY תגובה 1 תגובה אחרונה
                                        0
                                        • yossizY מנותק
                                          yossizY מנותק
                                          yossiz
                                          השיב לnigun ב נערך לאחרונה על ידי
                                          #40

                                          @nigun הנעילה מגינה מפני מספר מופעים באותו תהליך, אבל אם יש מספר מופעים של התהליך לא תעזור הנעילה.
                                          אבל זה לא לגמרי נכון כי זה תלוי איך עושים את הנעילה.

                                          📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                                          nigunN תגובה 1 תגובה אחרונה
                                          0

                                          • 1
                                          • 2
                                          • 3
                                          בא תתחבר לדף היומי!
                                          • התחברות

                                          • אין לך חשבון עדיין? הרשמה

                                          • התחברו או הירשמו כדי לחפש.
                                          • פוסט ראשון
                                            פוסט אחרון
                                          0
                                          • דף הבית
                                          • קטגוריות
                                          • פוסטים אחרונים
                                          • משתמשים
                                          • חיפוש
                                          • חוקי הפורום