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

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

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

כמה INSERT בדיוק באותו רגע - wp

מתוזמן נעוץ נעול הועבר תכנות
12 פוסטים 4 כותבים 323 צפיות 2 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • ש
    ש
    ש.ב.ח.
    כתב ב נערך לאחרונה על ידי
    #1

    שלום וברכה
    זוהי שאלה מדינית
    האם שייך שכמה גולשים ישלחו בקשת בדיקת מידע בדיוק באותו רגע?
    והאם יש איזה נעילה על הטבלה כך שהבעיה לעיל לא אמורה לקרות?

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

    WWWW תגובה 1 תגובה אחרונה
    1
    • ש ש.ב.ח.

      שלום וברכה
      זוהי שאלה מדינית
      האם שייך שכמה גולשים ישלחו בקשת בדיקת מידע בדיוק באותו רגע?
      והאם יש איזה נעילה על הטבלה כך שהבעיה לעיל לא אמורה לקרות?

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

      WWWW
      WWWW
      WWW
      כתב ב נערך לאחרונה על ידי
      #2

      @ש-ב-ח באיזו פלטפורמה?
      בעקרון זה התפקיד של מנוע מסד הנתונים.

      WWW.netfree@gmail.com || קשבק! החזר כספי לבנק על רכישות באינטרנט || עונים על סקרים ומרוויחים כסף!

      ש תגובה 1 תגובה אחרונה
      1
      • WWWW WWW

        @ש-ב-ח באיזו פלטפורמה?
        בעקרון זה התפקיד של מנוע מסד הנתונים.

        ש
        ש
        ש.ב.ח.
        כתב ב נערך לאחרונה על ידי ש.ב.ח.
        #3

        @WWW
        כתבתי בנושא wp
        כלומר wordpress
        mysqli

        @WWW אמר בכמה INSERT בדיוק באותו רגע - wp:

        בעקרון זה התפקיד של מנוע מסד הנתונים.

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

        WWWW תגובה 1 תגובה אחרונה
        0
        • ש ש.ב.ח.

          @WWW
          כתבתי בנושא wp
          כלומר wordpress
          mysqli

          @WWW אמר בכמה INSERT בדיוק באותו רגע - wp:

          בעקרון זה התפקיד של מנוע מסד הנתונים.

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

          WWWW
          WWWW
          WWW
          כתב ב נערך לאחרונה על ידי WWW
          #4

          @ש-ב-ח אמר בכמה INSERT בדיוק באותו רגע - wp:

          mysqli

          זה לא כתבת.

          @ש-ב-ח אמר בכמה INSERT בדיוק באותו רגע - wp:

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

          @dovid כתב לאחרונה בפורום שיש פונקציה מיוחדת ב SQL שיבצע פעולה רק אם הפעולה האחרת התבצעה, לא זוכר איך קוראים לזה.

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

          הבעיה היתה שקרה ו2 ניגשו ביחד וקיבלו אותו שורה, ואז שניהם קיבלו אותו ערך...

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

          מקווה שהובנתי...

          WWW.netfree@gmail.com || קשבק! החזר כספי לבנק על רכישות באינטרנט || עונים על סקרים ומרוויחים כסף!

          ש תגובה 1 תגובה אחרונה
          1
          • WWWW WWW

            @ש-ב-ח אמר בכמה INSERT בדיוק באותו רגע - wp:

            mysqli

            זה לא כתבת.

            @ש-ב-ח אמר בכמה INSERT בדיוק באותו רגע - wp:

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

            @dovid כתב לאחרונה בפורום שיש פונקציה מיוחדת ב SQL שיבצע פעולה רק אם הפעולה האחרת התבצעה, לא זוכר איך קוראים לזה.

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

            הבעיה היתה שקרה ו2 ניגשו ביחד וקיבלו אותו שורה, ואז שניהם קיבלו אותו ערך...

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

            מקווה שהובנתי...

            ש
            ש
            ש.ב.ח.
            כתב ב נערך לאחרונה על ידי
            #5

            @WWW אמר בכמה INSERT בדיוק באותו רגע - wp:

            ואז הייתי מחזיר שגיאה.

            ומה?
            צד הלקוח קיבל שגיאה?!
            מה הוא אשם?! 🙂

            תגובה 1 תגובה אחרונה
            0
            • dovidD
              dovidD
              dovid
              ניהול
              כתב ב נערך לאחרונה על ידי
              #6

              @ש-ב-ח הבעיה היא לא הSQL
              הבעיה היא הPHP, שמה בהחלט יכול להיות בעיה של ריצה בו זמנית.
              הפתרון לזה הוא נעילה, הקטע שחייב לרוץ "לבד" אתה עוטף עם flock.

              למשל אם יש לך קוד ששורה א' שלו בודקת אם המקום הנבחר פנוי, ב. אם התשובה חיובית מכניסה INSERT למסד, נכנס גולש מס' 1 ומתבצע עבורו שורה א, והתשובה חיובית. לבינתיים יש גולש 2 שגם עבורו מתבצעת שורה א', וגם שמה השורה חיובית. כעת שורה ב' תתבצע עבור שני הגולשים.
              אם שני השורות הללו יהיו בבלוק נעול, אז גולש 2 לא ייכנס לשורה א' עד שגולש 1 יגמור את שורה ב'.

              למה אני כותב שהבעיה בPHP? כי אם תגלגל את האחריות על המסד נתונים, למשל תעשה שהשדה של מס' המקום הוא ייחודי (אסור כפילות), אז ה"דאגה" של הבו זמניות ירדה מכתפיך - המסד נתונים מבצע את הנעילה וממילא מחזיר שגיאה לאחד מהם (מה אכפת לך איזה). אתה בקוד תופס את השגיאה (או לא..) עם catch וכותב למשתמש "אויש, המקום כבר נתפס לבינתיים".

              • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
              • בכל נושא אפשר ליצור קשר dovid@tchumim.com
              ש 2 תגובות תגובה אחרונה
              7
              • dovidD dovid

                @ש-ב-ח הבעיה היא לא הSQL
                הבעיה היא הPHP, שמה בהחלט יכול להיות בעיה של ריצה בו זמנית.
                הפתרון לזה הוא נעילה, הקטע שחייב לרוץ "לבד" אתה עוטף עם flock.

                למשל אם יש לך קוד ששורה א' שלו בודקת אם המקום הנבחר פנוי, ב. אם התשובה חיובית מכניסה INSERT למסד, נכנס גולש מס' 1 ומתבצע עבורו שורה א, והתשובה חיובית. לבינתיים יש גולש 2 שגם עבורו מתבצעת שורה א', וגם שמה השורה חיובית. כעת שורה ב' תתבצע עבור שני הגולשים.
                אם שני השורות הללו יהיו בבלוק נעול, אז גולש 2 לא ייכנס לשורה א' עד שגולש 1 יגמור את שורה ב'.

                למה אני כותב שהבעיה בPHP? כי אם תגלגל את האחריות על המסד נתונים, למשל תעשה שהשדה של מס' המקום הוא ייחודי (אסור כפילות), אז ה"דאגה" של הבו זמניות ירדה מכתפיך - המסד נתונים מבצע את הנעילה וממילא מחזיר שגיאה לאחד מהם (מה אכפת לך איזה). אתה בקוד תופס את השגיאה (או לא..) עם catch וכותב למשתמש "אויש, המקום כבר נתפס לבינתיים".

                ש
                ש
                ש.ב.ח.
                כתב ב נערך לאחרונה על ידי
                #7

                @dovid אמר בכמה INSERT בדיוק באותו רגע - wp:

                הקטע שחייב לרוץ "לבד" אתה עוטף עם flock.

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

                תגובה 1 תגובה אחרונה
                0
                • dovidD dovid

                  @ש-ב-ח הבעיה היא לא הSQL
                  הבעיה היא הPHP, שמה בהחלט יכול להיות בעיה של ריצה בו זמנית.
                  הפתרון לזה הוא נעילה, הקטע שחייב לרוץ "לבד" אתה עוטף עם flock.

                  למשל אם יש לך קוד ששורה א' שלו בודקת אם המקום הנבחר פנוי, ב. אם התשובה חיובית מכניסה INSERT למסד, נכנס גולש מס' 1 ומתבצע עבורו שורה א, והתשובה חיובית. לבינתיים יש גולש 2 שגם עבורו מתבצעת שורה א', וגם שמה השורה חיובית. כעת שורה ב' תתבצע עבור שני הגולשים.
                  אם שני השורות הללו יהיו בבלוק נעול, אז גולש 2 לא ייכנס לשורה א' עד שגולש 1 יגמור את שורה ב'.

                  למה אני כותב שהבעיה בPHP? כי אם תגלגל את האחריות על המסד נתונים, למשל תעשה שהשדה של מס' המקום הוא ייחודי (אסור כפילות), אז ה"דאגה" של הבו זמניות ירדה מכתפיך - המסד נתונים מבצע את הנעילה וממילא מחזיר שגיאה לאחד מהם (מה אכפת לך איזה). אתה בקוד תופס את השגיאה (או לא..) עם catch וכותב למשתמש "אויש, המקום כבר נתפס לבינתיים".

                  ש
                  ש
                  ש.ב.ח.
                  כתב ב נערך לאחרונה על ידי
                  #8

                  @dovid

                  את המתכוון לכזה דבר

                  <?php
                  
                      class Locker {
                  
                          public $filename;
                          private $_lock;
                  
                          public function __construct($filename) {
                              $this->filename = $filename;
                          }
                  
                          /**
                           * locks relevant file
                           */
                          public function lock() {
                                  touch($this->filename);
                                  $this->_lock = fopen($this->filename, 'r');
                                  flock($this->_lock, LOCK_EX);
                          }
                  
                          /**
                           * unlock above file
                           */
                          public function unlock() {
                                  flock($this->_lock, LOCK_UN);
                          }
                  
                      }
                  
                      $locker = new Locker('locker.lock');
                      echo "Waiting\n";
                      $locker->lock();
                      echo "Sleeping\n";
                      sleep(30);
                      echo "Done\n";
                      $locker->unlock();
                  
                  ?>
                  

                  הועתק מ https://stackoverflow.com/a/30711675/11322208

                  תגובה 1 תגובה אחרונה
                  0
                  • dovidD
                    dovidD
                    dovid
                    ניהול
                    כתב ב נערך לאחרונה על ידי
                    #9

                    זה מימוש משוכלל, הפשטות היא ככה

                    $fp = fopen("/tmp/lock.txt", "r+");
                    
                    if (flock($fp, LOCK_EX)) { 
                        //code or function call
                    } else {
                        echo "failed to obtain lock";
                    }
                    
                    fclose($fp);
                    

                    https://stackoverflow.com/questions/15305296/how-to-use-flock-in-php

                    • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                    • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                    ש תגובה 1 תגובה אחרונה
                    2
                    • yossizY
                      yossizY
                      yossiz
                      כתב ב נערך לאחרונה על ידי
                      #10

                      @dovid לא הבנתי דבריך. האם יש עדיפות שהקוד יטפל בנעילה ולא ה-DB?

                      📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה
                      👈 רוצים כתובת מייל בעברית? כנסו למייל.קום 👉

                      dovidD תגובה 1 תגובה אחרונה
                      0
                      • yossizY yossiz

                        @dovid לא הבנתי דבריך. האם יש עדיפות שהקוד יטפל בנעילה ולא ה-DB?

                        dovidD
                        dovidD
                        dovid
                        ניהול
                        כתב ב נערך לאחרונה על ידי
                        #11

                        @yossiz אני לא רמזתי כזה דבר, זה מאוד תלוי בסיטואציה.
                        אחריות של הDB זה מעולה מכמה סיבות אבל המון פעמים אי אפשר להעביר את האחריות לDB, וגם כשאפשר לפעמים זה לא כ"כ נכון.

                        • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                        • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                        תגובה 1 תגובה אחרונה
                        3
                        • dovidD dovid

                          זה מימוש משוכלל, הפשטות היא ככה

                          $fp = fopen("/tmp/lock.txt", "r+");
                          
                          if (flock($fp, LOCK_EX)) { 
                              //code or function call
                          } else {
                              echo "failed to obtain lock";
                          }
                          
                          fclose($fp);
                          

                          https://stackoverflow.com/questions/15305296/how-to-use-flock-in-php

                          ש
                          ש
                          ש.ב.ח.
                          כתב ב נערך לאחרונה על ידי ש.ב.ח.
                          #12

                          @dovid אמר בכמה INSERT בדיוק באותו רגע - wp:

                          הפשטות היא ככה

                          זה אומר שאחד מהם יקבל שגיאה?
                          איך אפשר לחסוך את השגיאה?
                          אולי עם sleep ואחרי זה נסיון חוזר?

                          עריכה: פשוט ניסיתי וראיתי שזה איכן ממתין...
                          תודה על הכל @dovid

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

                          שלום! נראה שהשיחה הזו מעניינת אותך, אבל עדיין אין לך חשבון.

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

                          בעזרת התרומה שלך, הפוסט הזה יכול להיות אפילו טוב יותר 💗

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


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

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

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