Home

Реклама

Настроить
За работой

Март 2008

Вс Пн Вт Ср Чт Пт Сб
      1
2345678
9101112131415
16171819202122
23242526272829
3031     

Трансляция

RSS Atom
Разработано LiveJournal.com

23 Янв, 2022

За работой

(без темы)

Здраствуйте, уважаемые читатели моего журнала.

Меня зовут Евгений Кодин.

Я — обыкновенный человек, без особых достоинств и недостатков. Я не ношу очков (хотя давно пора бы) и последние восемь лет жизни 20 часов в сутки провожу за компьютером, даже когда болею.

Я работаю аналитиком в крупной компании над проектом, посещаемость которого превышает один миллион посетителей в день. В свободное время консультирую различные компании по различным вопросам, связанным с их web-проектами.

Каждый вечер у меня есть немного не занятого ничем времени — его я решил потратить на свой журнал. По мере того, как будет просыпаться желание или просто в голову будут приходить интересные мысли, я буду публиковать их здесь или просто отвечать на ваши вопросы.

Пишите в комментах — кто вы, чем занимаетесь и я добавлю вас в друзья.

2 Мар, 2008

За работой

Немного о транзакциях в MySQL

Здравствуйте, дорогие читатели.

Приводя в порядок один из проектов я наткнулся на неочевидную ошибку, которую совершает невообразимое количество программистов. Общий смысл кода был такой:

// Запрещаем коммит
$hasApprovedCommit = false;

// начинаем транзакцию
query("START TRANSACTION");

// Вставляем некоторую запись в таблицу
query("
    INSERT INTO
        table 
    SET 
        key='value'
");

// Создаем таблицу
query("
    CREATE TABLE test (
        id INT auto_increment,
        key VARCHAR(255),
        
        PRIMARY KEY(id)
    )
");

// Откат или коммит?
if ($hasApprovedCommit) {
    query("COMMIT");
}
else {
    query("ROLLBACK");
}


По мнению автора кода ни новой записи в таблице table, ни таблицы test в базе появиться не должно было. Однако, несмотря на его ожидания, и запись добавилась и таблица создалась.

Разберемся в проблеме подробнее.

Конструкции в MySQL делятся на два вида - откатываемые и неоткатываемые. К конструкциям, которые невозможно откатить, относятся конструкции языка определения данных (data definition language, DDL), что очевидно — некоторые ALTER-запросы могут выполняется по нескольку часов и откат таких запросов был бы чрезмерно ресурсоемким.

Камнем преткновения этого кода является то, что конструкция CREATE TABLE не просто неоткатываемая — если таковая конструкция попадается в транзакции, она автоматически вызывает COMMIT всех предыдущих конструкций.

Полный перечень таких конструкций перечислен здесь:

http://dev.mysql.com/doc/refman/4.1/en/implicit-commit.html

К сожалению, такие ошибки очень сложно локализовывать и потому при написании транзакций следует проявлять особенную бдительность.

Реклама

Настроить