15-04-2011, 12:10
|
מנהל
|
|
חבר מתאריך: 26.07.08
הודעות: 6,473
|
|
גרימת האי-סדר יכול להיגרם במקרה בו שתי לקוחות מריצים את הקוד הבא שאינו חלק מ-transaction אחד (או פשוט במנוע שאינו transactional כמו MyISAM):
קוד:
#1: INSERT tbl_a (auto_increment_culumn_A, ...) VALUES(NULL, ...)
#2: SET @AUTO_INC_VAL := (SELECT MAX(auto_increment_culumn_A) FROM tbl_a);
#3: INSERT tbl_b (col_B, ...) VALUES(@AUTO_INC_VAL, ...)
תאר לך שקורה הדבר הבא לפי הסדר:- לקוח א' מריץ את שורה מס' 1
- לקוח ב' מריץ את שורה מס' 1
- לקוח א' מריץ את שורה מס' 2 ו-3
במצב כזה באמת יכולה להיות בעיה, כי לקוח א' יקבל את ה-id שמתאים ללקוח ב'.
אבל דבר כזה לא יכול לקרות עם LAST_INSERT_ID, פשוט כי ה-id האחרון שנוצר מטור בעל תכונת AUTO_INCREMENT נשמר per connection.
לכן עם LAST_INSERT_ID זה לא משנה כמה לקוחות יריצו את שורה מס' 1 אחרי שהריץ אותה לקוח א', כי הערך טור ה-auto inc האחרון שנוצר נשמר עבור כל לקוח בנפרד.
חפש על "database transactions" ו-ACID
להמשך שאלות שקשורות ל-SQL ומסדי נתונים, נא פתח את האשכול בפורום המתאים...
נערך לאחרונה ע"י dorM בתאריך 15-04-2011 בשעה 12:13.
|