MySQL אכן צעצוע - או rollback לא עובד בצורה מסתורית על InnoDB

ב־27.11.2010, מאת ארתיום; פורסם תחת: תכנה חופשית, תכנה ומחשבים; ‏4 תגובות

עידו, מאיר, שי - אתם צודקים! MySQL אכן צעצוע!

תוך כדי הרצת Unit Test של עבודה מול ODBC גיליתי שטרקציות לא מבצעות roolback. מידי הבנתי ששכחתי להגדיר את הטבלה כ־InnoDB והרצתי את הטסט שוב עם טבלה חדשה. עדיין נכשל. WTF? נכנסתי ללקוח של MySQL והרצתי:

create table test ( i integer ) Engine = InnoDB;
begin;
insert into test(i) values(10);
insert into test(i) values(20);
rollback;
select count(*) from test;

ואני מקבל כפלט 2 במקום 0? WTF $%^$%^&#$%^#&^#%&?

פניתי ל־Stackoverflow‏ אולי אני עושה משהו לא נכון וקיבלתי תשובה: הקוד שלי בסדר גמור.

אולי גרסת בסיס נתונים ישנה 5.0.51? התקנתי 5.1.49 עדיין אותה בעיה! ניסיתי לחזור ל־5.0.51 סקריפט של dpkg נכשל! משהו פה ממש לא בסדר.

מחקתי את בסיס הנתונים עם Purge - קרי מחקתי התקנה, הגדרות ואת כל בסיסי הנתונים, התקנתי 5.0.51 מחדש ו... זה אכן עובד.

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

עידו, מאיר, שי אנשים יקרים: אתם צודקים... MySQL זה צעצוע.

עכשיו השאלה - כיצד אני מכייל את PostgreSQL לביצועים דומים? :-)

תגובות

אורי, ב־27.11.2010, 13:37

אתה בטוח שהפעלת את התמיכה ב-InnoDB? נסה אחרי פקודת ה-CREATE לרשום: SHOW CREATE TABLE test; כדי לבדוק באיזה מנוע נוצרה הטבלה. (לא שזה עוזר, אבל.. "אצלי זה לא קורה" :P)

ארתיום, ב־27.11.2010, 13:44

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

Shlomi Noach, ב־1.12.2010, 12:52

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

למרות שכבר עובד לך, מישהו יכול להתקל בבעייה דומה, אז אנסה לעזור: בדוק בבקשה שהטבלה שלך היא אכן InnoDB. אני יודע שהגדרת אותה כך, אבל יתכן ואין לך InnoDB או שיש שגיאה בעליית InnoDB.

בצע SHOW TABLE STATUS LIKE 'test'.

האם כתוב שם שהטבלה היא InnoDB? אני מנחש שלא. בדקו ב-error log מה הבעייה עם טעינת innodb.

מה שלא יפה מצדו של MySQL הוא שהוא לא אומר שלא ניתן להגדיר את הטבלה כ-InnoDB, ונותן חלופה "שקטה".

ראה רשומה שלי בנושא: But I DO want MySQL to say ERROR!

דרך אגב, אני לא מצליח להכניס לינקים לתגובה, למרות שאני עוקב אחרי הסינטקס של Markdown.

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

ארתיום, ב־2.12.2010, 12:07

מספר הערות:

  1. אני מחקתי את כל ההתקנה ועשיתי התקנה מחדש כך שאני לא יודע לשחזר ולבדוק את הבעיה שוב.
  2. אני מאמין שאחד משני הדברים קרו:
    • או שקובץ בסיס הנתונים נפגע ולכן טרנזקציות נכשלו באופן שקט (לא היה דבר בלוגים אגב)
    • או שקובץ הגדרות של MySQL נפגע קשות ו"ביטל" תמיכה ב־InnoDB, כי שים לב שאני כן יצרתי טבלה על בסיס InnoDB (הרצתי את הקוד הזה ממש כ־Copy-Paste) הורץ מספר פעמים ושוב זה קרה באופן שקט גם ללא הודעות ללוג.

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

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

הוסף תגובה:

 
 כתובת דוא"ל לא תוצג
 

ניתן לכתוב תגובות עם שימוש בתחביר Markdown.

חובה לאפשר JavaScript כדי להגיב.

דפים

נושאים