<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: MySQL: Single row lock implementation</title>
	<atom:link href="http://voituk.kiev.ua/2009/06/24/mysql-single-row-lock-implementation/feed/" rel="self" type="application/rss+xml" />
	<link>http://voituk.kiev.ua/2009/06/24/mysql-single-row-lock-implementation/</link>
	<description>while ( isAlive() ) {doCode(); doFun();}</description>
	<lastBuildDate>Tue, 07 Sep 2010 14:29:30 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
	<item>
		<title>By: Vadim Voituk</title>
		<link>http://voituk.kiev.ua/2009/06/24/mysql-single-row-lock-implementation/comment-page-1/#comment-41413</link>
		<dc:creator>Vadim Voituk</dc:creator>
		<pubDate>Thu, 22 Oct 2009 11:14:01 +0000</pubDate>
		<guid isPermaLink="false">http://voituk.kiev.ua/?p=1066#comment-41413</guid>
		<description>@v0id,
А какими механизмами в MySQL можно указать типа блокировки wait/nowait?</description>
		<content:encoded><![CDATA[<p>@v0id,<br />
А какими механизмами в MySQL можно указать типа блокировки wait/nowait?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: v0id</title>
		<link>http://voituk.kiev.ua/2009/06/24/mysql-single-row-lock-implementation/comment-page-1/#comment-41412</link>
		<dc:creator>v0id</dc:creator>
		<pubDate>Thu, 22 Oct 2009 10:55:02 +0000</pubDate>
		<guid isPermaLink="false">http://voituk.kiev.ua/?p=1066#comment-41412</guid>
		<description>Зашел сюда случайно, но не сдержался написать :)
Как раз такие задачи и решаются транзакциями (они как раз и были придуманы для решения проблемы одновременного изменения записи в таблице двумя клиентами). Для работы клиентской части используется две транзакции - пишущая и читающая. Причем время жизни пишущей очень мало, она живет только на время выполнение запроса insert\update. Какой метод блокировки(wait\nowait) ты выберешь, уже зависит от твоей задачи. Такая схема используется в многопользовательских приложениях с большим количеством insert\update запросов.</description>
		<content:encoded><![CDATA[<p>Зашел сюда случайно, но не сдержался написать :)<br />
Как раз такие задачи и решаются транзакциями (они как раз и были придуманы для решения проблемы одновременного изменения записи в таблице двумя клиентами). Для работы клиентской части используется две транзакции &#8211; пишущая и читающая. Причем время жизни пишущей очень мало, она живет только на время выполнение запроса insert\update. Какой метод блокировки(wait\nowait) ты выберешь, уже зависит от твоей задачи. Такая схема используется в многопользовательских приложениях с большим количеством insert\update запросов.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: bioplex</title>
		<link>http://voituk.kiev.ua/2009/06/24/mysql-single-row-lock-implementation/comment-page-1/#comment-38755</link>
		<dc:creator>bioplex</dc:creator>
		<pubDate>Sun, 19 Jul 2009 17:33:52 +0000</pubDate>
		<guid isPermaLink="false">http://voituk.kiev.ua/?p=1066#comment-38755</guid>
		<description>^^^ это если решать на уровне приложения

з.ы. это всё догадки, у меня только махонький экспиренс на PHP, поэтому мог не понять всей тонкости ситуации</description>
		<content:encoded><![CDATA[<p>^^^ это если решать на уровне приложения</p>
<p>з.ы. это всё догадки, у меня только махонький экспиренс на PHP, поэтому мог не понять всей тонкости ситуации</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: bioplex</title>
		<link>http://voituk.kiev.ua/2009/06/24/mysql-single-row-lock-implementation/comment-page-1/#comment-38754</link>
		<dc:creator>bioplex</dc:creator>
		<pubDate>Sun, 19 Jul 2009 17:26:36 +0000</pubDate>
		<guid isPermaLink="false">http://voituk.kiev.ua/?p=1066#comment-38754</guid>
		<description>придумалось такое:
Представьте сидящих в кафешке посетителей, вызывающих по почти-почти одновременному сигналу официанта. Предлагается реализовать подачу такого сигнала через переменную, первоначально равную нулю. При подаче сигнала, выражаущего намерение обслужиться, значение переменной возрастает на единицу. Итак, при условии нуля  &quot;посетитель&quot; увеличивает значение на единицу и сразу же проверяет, не успел ли кто одновременно подать такой же сигнал (т.е. переменная могла стать больше 1). Если так, то он сразу же уменьшает на 1 переменную и снова &quot;ждёт&quot; нуля. Как только &quot;клиент&quot; обслужился, переменная сбрасывается в ноль. Ещё может быть случай с образованием очереди (думаю это вы знаете как реализовать).</description>
		<content:encoded><![CDATA[<p>придумалось такое:<br />
Представьте сидящих в кафешке посетителей, вызывающих по почти-почти одновременному сигналу официанта. Предлагается реализовать подачу такого сигнала через переменную, первоначально равную нулю. При подаче сигнала, выражаущего намерение обслужиться, значение переменной возрастает на единицу. Итак, при условии нуля  &#8220;посетитель&#8221; увеличивает значение на единицу и сразу же проверяет, не успел ли кто одновременно подать такой же сигнал (т.е. переменная могла стать больше 1). Если так, то он сразу же уменьшает на 1 переменную и снова &#8220;ждёт&#8221; нуля. Как только &#8220;клиент&#8221; обслужился, переменная сбрасывается в ноль. Ещё может быть случай с образованием очереди (думаю это вы знаете как реализовать).</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Vadim Voituk</title>
		<link>http://voituk.kiev.ua/2009/06/24/mysql-single-row-lock-implementation/comment-page-1/#comment-38294</link>
		<dc:creator>Vadim Voituk</dc:creator>
		<pubDate>Wed, 08 Jul 2009 20:13:52 +0000</pubDate>
		<guid isPermaLink="false">http://voituk.kiev.ua/?p=1066#comment-38294</guid>
		<description>&lt;b&gt;Alexius&lt;/b&gt;,
Как раз бред - это пихать транзакции туда, где ими и не пахнета, а банально нужна блокировка записи или &quot;выпрямилель&quot;, 
Ну и ловить в этом случае исключения о провале транзакции - полная ахинея - получается, что попытки COMMIT-ов выполняют роль функции IS_FREE_LOCK (Ok=Not Locked, Exception=Locked) - не находите это &quot;перегибом&quot;?

Согласен что SELECT FOR UPDATE более красивое решение, но на не-InnoDB-таблицах лучшего я не придумал.
Также согласен с &lt;b&gt;crypto5&lt;/b&gt;, что лучше это делать на уровне приложения, но тогда мне самому прийдется заботиться он &quot;замерших&quot; блокировках и таймаутах

Вырезка из документации MySQL o GET_LOCK:
&lt;i&gt;This function can be used to implement application locks or to simulate record locks. &lt;/i&gt;

Мне кажется вы неправильно поняли исходную задачу - нам надо выполнить действия ОБЕИХ паралельных клиентов, но &quot;по очереди&quot; дабы избежать описанного race condition.

Проясните как &quot;использовать должный уровень изоляции в транзакции&quot; для описанной задачи в  MySQL?</description>
		<content:encoded><![CDATA[<p><b>Alexius</b>,<br />
Как раз бред &#8211; это пихать транзакции туда, где ими и не пахнета, а банально нужна блокировка записи или &#8220;выпрямилель&#8221;,<br />
Ну и ловить в этом случае исключения о провале транзакции &#8211; полная ахинея &#8211; получается, что попытки COMMIT-ов выполняют роль функции IS_FREE_LOCK (Ok=Not Locked, Exception=Locked) &#8211; не находите это &#8220;перегибом&#8221;?</p>
<p>Согласен что SELECT FOR UPDATE более красивое решение, но на не-InnoDB-таблицах лучшего я не придумал.<br />
Также согласен с <b>crypto5</b>, что лучше это делать на уровне приложения, но тогда мне самому прийдется заботиться он &#8220;замерших&#8221; блокировках и таймаутах</p>
<p>Вырезка из документации MySQL o GET_LOCK:<br />
<i>This function can be used to implement application locks or to simulate record locks. </i></p>
<p>Мне кажется вы неправильно поняли исходную задачу &#8211; нам надо выполнить действия ОБЕИХ паралельных клиентов, но &#8220;по очереди&#8221; дабы избежать описанного race condition.</p>
<p>Проясните как &#8220;использовать должный уровень изоляции в транзакции&#8221; для описанной задачи в  MySQL?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: crypto5</title>
		<link>http://voituk.kiev.ua/2009/06/24/mysql-single-row-lock-implementation/comment-page-1/#comment-38287</link>
		<dc:creator>crypto5</dc:creator>
		<pubDate>Wed, 08 Jul 2009 17:35:55 +0000</pubDate>
		<guid isPermaLink="false">http://voituk.kiev.ua/?p=1066#comment-38287</guid>
		<description>2 Alexius
В данном случае транзакции не меняют конкурентно одну и туже запись, а добавляют новые данные, поэтому твой пример здесь вроде как не подходит.</description>
		<content:encoded><![CDATA[<p>2 Alexius<br />
В данном случае транзакции не меняют конкурентно одну и туже запись, а добавляют новые данные, поэтому твой пример здесь вроде как не подходит.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Alexius</title>
		<link>http://voituk.kiev.ua/2009/06/24/mysql-single-row-lock-implementation/comment-page-1/#comment-38285</link>
		<dc:creator>Alexius</dc:creator>
		<pubDate>Wed, 08 Jul 2009 16:54:24 +0000</pubDate>
		<guid isPermaLink="false">http://voituk.kiev.ua/?p=1066#comment-38285</guid>
		<description>&gt;TransactionB: commit =&gt; OK, added another row instance, got - RACE CONDITION

такой ситуации никак не может быть, если использовать должный уровень изоляции в транзакции. В режиме serialize если одна транзакция попытается изменить данные, которые используются другой, то возникнет исключение, которое можно обработать и откатить 2ю транзацию и попытаться её повторить позже.
ИМХО, это как раз та ситуация, когда транзакции и нужны. Не нужно городить огород с мютексами и блокировкой таблицы (что за бред!).</description>
		<content:encoded><![CDATA[<p>&gt;TransactionB: commit =&gt; OK, added another row instance, got &#8211; RACE CONDITION</p>
<p>такой ситуации никак не может быть, если использовать должный уровень изоляции в транзакции. В режиме serialize если одна транзакция попытается изменить данные, которые используются другой, то возникнет исключение, которое можно обработать и откатить 2ю транзацию и попытаться её повторить позже.<br />
ИМХО, это как раз та ситуация, когда транзакции и нужны. Не нужно городить огород с мютексами и блокировкой таблицы (что за бред!).</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Dima</title>
		<link>http://voituk.kiev.ua/2009/06/24/mysql-single-row-lock-implementation/comment-page-1/#comment-38270</link>
		<dc:creator>Dima</dc:creator>
		<pubDate>Wed, 08 Jul 2009 10:02:14 +0000</pubDate>
		<guid isPermaLink="false">http://voituk.kiev.ua/?p=1066#comment-38270</guid>
		<description>Да советую почитать книжечку по MySQL Strored Procedure. В текущей логике -  у тебя получается ты блокируешь - посылаешь запрос  - получаешь ответ  - смотришь на него - посылаешь в зависимости от ответа еще запрос - разблокируешь. С хранимой процедурой ты посылаешь инфу на сервер и получаешь ответ в котором написано как все прошло  . С моей точки зрения так проще.!!! Плюс хранимые процедуры позволяют не менять код в случае чего а просто поменять процедуру.</description>
		<content:encoded><![CDATA[<p>Да советую почитать книжечку по MySQL Strored Procedure. В текущей логике &#8211;  у тебя получается ты блокируешь &#8211; посылаешь запрос  &#8211; получаешь ответ  &#8211; смотришь на него &#8211; посылаешь в зависимости от ответа еще запрос &#8211; разблокируешь. С хранимой процедурой ты посылаешь инфу на сервер и получаешь ответ в котором написано как все прошло  . С моей точки зрения так проще.!!! Плюс хранимые процедуры позволяют не менять код в случае чего а просто поменять процедуру.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Vadim Voituk</title>
		<link>http://voituk.kiev.ua/2009/06/24/mysql-single-row-lock-implementation/comment-page-1/#comment-38267</link>
		<dc:creator>Vadim Voituk</dc:creator>
		<pubDate>Wed, 08 Jul 2009 09:18:23 +0000</pubDate>
		<guid isPermaLink="false">http://voituk.kiev.ua/?p=1066#comment-38267</guid>
		<description>&lt;b&gt;Dima&lt;/b&gt;
Сделает что? Исключит паралельный доступ к строке?</description>
		<content:encoded><![CDATA[<p><b>Dima</b><br />
Сделает что? Исключит паралельный доступ к строке?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Dima</title>
		<link>http://voituk.kiev.ua/2009/06/24/mysql-single-row-lock-implementation/comment-page-1/#comment-38264</link>
		<dc:creator>Dima</dc:creator>
		<pubDate>Wed, 08 Jul 2009 08:26:40 +0000</pubDate>
		<guid isPermaLink="false">http://voituk.kiev.ua/?p=1066#comment-38264</guid>
		<description>Зачем мучать себе мозе ? Не проще ли хранимую процедурку написать, вызвав которую одним запросом  - и она все сделает. Так красивее!! ИМХО. И плюс быстрее..</description>
		<content:encoded><![CDATA[<p>Зачем мучать себе мозе ? Не проще ли хранимую процедурку написать, вызвав которую одним запросом  &#8211; и она все сделает. Так красивее!! ИМХО. И плюс быстрее..</p>
]]></content:encoded>
	</item>
</channel>
</rss>
