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

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

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

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

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

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

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

    ש תגובה 1 תגובה אחרונה
    1
    • ש מנותק
      ש מנותק
      ש.ב.ח.
      השיב לWWW ב נערך לאחרונה על ידי ש.ב.ח.
      #3

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

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

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

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

      WWWW תגובה 1 תגובה אחרונה
      0
      • WWWW מנותק
        WWWW מנותק
        WWW
        השיב לש.ב.ח. ב נערך לאחרונה על ידי WWW
        #4

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

        mysqli

        זה לא כתבת.

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

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

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

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

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

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

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

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

        ש תגובה 1 תגובה אחרונה
        1
        • ש מנותק
          ש מנותק
          ש.ב.ח.
          השיב לWWW ב נערך לאחרונה על ידי
          #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
            • ש מנותק
              ש מנותק
              ש.ב.ח.
              השיב לdovid ב נערך לאחרונה על ידי
              #7

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

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

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

              תגובה 1 תגובה אחרונה
              0
              • ש מנותק
                ש מנותק
                ש.ב.ח.
                השיב לdovid ב נערך לאחרונה על ידי
                #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
                    • dovidD מנותק
                      dovidD מנותק
                      dovid ניהול
                      השיב לyossiz ב נערך לאחרונה על ידי
                      #11

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

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

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

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

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

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

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

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

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

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

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

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