עבור לתוכן

עזרה MYSQL

Featured Replies

פורסם

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

אני משתשמש ב MYSQL 5.1.33 עם מנוע INNODB גירסה 1 שמובנת ב DB.

אז מהר מאד הבנתי שמשום מה ברירת המחדל שלו הוא AUTO COMMIT

וצריך להשתמש ב SET AUTOCOMMIT = 0 בכדי לכתוב טרנזקציות.

אחרי שהבנתי את זה רציתי לעשות שימוש ב SELECT FOR UPDATE בכדי לנעול שורה בטרנזקציה אחת

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

דוגמא:

טרנזקציה 1:

SET AUTOCOMMIT = 0

SELECT * FROM X WERE Y=Z FOR UPDATE

(בשלב הזה הרשומה צריכה להיות נעולה)

טרנזקציה 2:

SET AUTOCOMMIT = 0

SELECT * FROM X WERE Y=Z

למרות שהשורה אמורה להיות נעולה אני מקבל תוצאה.

הנעילה עבדה רק כאשר הוספתי 'FOR UPDATE' גם לשאילתא של הטרנזקציה השניה

וגם אז הנעילה היתה על כל הטבלה ולא רק על השורה

זאת התנהגות מאד מוזרה של ה DB , משהוא פה יכול להסביר לי למה הוא מתנהג ככה.

התחושה שלי שזה קשור במנוע INNODB אבל באמת אין מושג מה קורה פה ולמה הוא לא מתנהג כמו כל DB נורמלי

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים