<?xml version='1.0' encoding='utf-8' ?>
<!--  If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/  -->
<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/' xmlns:media='http://search.yahoo.com/mrss/' xmlns:atom10='http://www.w3.org/2005/Atom'>
<channel>
  <title>Дневник Евгения Кодина</title>
  <link>http://eugenecoder.livejournal.com/</link>
  <description>Дневник Евгения Кодина - LiveJournal.com</description>
  <lastBuildDate>Sun, 02 Mar 2008 01:33:17 GMT</lastBuildDate>
  <generator>LiveJournal / LiveJournal.com</generator>
  <lj:journal>eugenecoder</lj:journal>
  <lj:journalid>14738843</lj:journalid>
  <lj:journaltype>personal</lj:journaltype>
  <atom10:link rel='hub' href='http://pubsubhubbub.appspot.com/' />
  <image>
    <url>http://l-userpic.livejournal.com/70700740/14738843</url>
    <title>Дневник Евгения Кодина</title>
    <link>http://eugenecoder.livejournal.com/</link>
    <width>100</width>
    <height>100</height>
  </image>

<item>
  <guid isPermaLink='true'>http://eugenecoder.livejournal.com/1302.html</guid>
  <pubDate>Sun, 02 Mar 2008 01:33:17 GMT</pubDate>
  <title>Немного о транзакциях в MySQL</title>
  <link>http://eugenecoder.livejournal.com/1302.html</link>
  <description>Здравствуйте, дорогие читатели.&lt;br /&gt;&lt;br /&gt;Приводя в порядок один из проектов я наткнулся на неочевидную ошибку, которую совершает невообразимое количество программистов. Общий смысл кода был такой:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
// Запрещаем коммит
$hasApprovedCommit = false;

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

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

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

// Откат или коммит?
if ($hasApprovedCommit) {
    query(&quot;COMMIT&quot;);
}
else {
    query(&quot;ROLLBACK&quot;);
}
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;По мнению автора кода ни новой записи в таблице table, ни таблицы test в базе появиться не должно было. Однако, несмотря на его ожидания, и запись добавилась и таблица создалась.&lt;br /&gt;&lt;br /&gt;Разберемся в проблеме подробнее.&lt;br /&gt;&lt;br /&gt;Конструкции в MySQL делятся на два вида - откатываемые и неоткатываемые. К конструкциям, которые невозможно откатить, относятся конструкции языка определения данных (data definition language, DDL), что очевидно — некоторые ALTER-запросы могут выполняется по нескольку часов и откат таких запросов был бы чрезмерно ресурсоемким.&lt;br /&gt;&lt;br /&gt;Камнем преткновения этого кода является то, что конструкция CREATE TABLE не просто неоткатываемая — если таковая конструкция попадается в транзакции, она автоматически вызывает COMMIT всех предыдущих конструкций.&lt;br /&gt;&lt;br /&gt;Полный перечень таких конструкций перечислен здесь:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://dev.mysql.com/doc/refman/4.1/en/implicit-commit.html&quot;&gt;http://dev.mysql.com/doc/refman/4.1/en/implicit-commit.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;К сожалению, такие ошибки очень сложно локализовывать и потому при написании транзакций следует проявлять особенную бдительность.</description>
  <comments>http://eugenecoder.livejournal.com/1302.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
</channel>
</rss>
