הבלוג של ארתיום
בלוג על לינוקס, תוכנה חופשית, מוזיקה, סלסה, ומה לא!
MySQL אכן צעצוע - או rollback לא עובד בצורה מסתורית על InnoDB
עידו, מאיר, שי - אתם צודקים! 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 לביצועים דומים? :-)
תגובות
אתה בטוח שהפעלת את התמיכה ב-InnoDB? נסה אחרי פקודת ה-CREATE לרשום: SHOW CREATE TABLE
test
; כדי לבדוק באיזה מנוע נוצרה הטבלה. (לא שזה עוזר, אבל.. "אצלי זה לא קורה" :P)אורי, תקרא עד הסוף, הבעיה הייתה ככל־הנראה בקובצי בסיס הנתונים הפגומים. עכשיו זה ועובד (וכן, זה היה InnoDB).
היי, מעניין שבדיוק דבר דומה נאמר לא מזמן בניכר, בהקשר אחר.
למרות שכבר עובד לך, מישהו יכול להתקל בבעייה דומה, אז אנסה לעזור: בדוק בבקשה שהטבלה שלך היא אכן 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 שאני מכיר.
מספר הערות:
תבין אני מאוד אוהב את בסיס הנתונים הזה ועובד איתו, אבל המקרה הזה מאוד עיצבן אותי ואני מתחיל להאמין שיש משהו במה שאומרים עליו - כי אתה לא אמור להגלות בעיות כאלה במקרה כי פתאום unit-test שמערכת אחרת לגמרי נופל.
מזל שזה רק בסיס הנתונים של פיתוח כך ששום דבר חשוב לא נפגע, אבל זה גורם לי לפקפק בו יותר.
הוסף תגובה:
חובה לאפשר JavaScript כדי להגיב.