2013-06-16 5 views
0

Новый проект заставил меня заблокировать таблицу во время обработки обновлений. Я следил за каждым предложением и руководством, которое я могу найти, в том числе How to lock mysql tables in php и http://dev.mysql.com/doc/refman/5.1/en/innodb-locking-reads.html, но всегда получаю ту же ошибку: # 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «LIMIT 0, 30» по строке 1Результаты MySql «для обновления» Ошибка

Для того, чтобы пройти мимо всех возможных демонов в моей живой таблице, я создал новую таблицу на INNODB двигатель для тестирования, добавлен уникальный индекс, вставляется несколько строк, и используется следующий синтаксис для запроса:

SELECT svalue FROM `test` WHERE skey='key2' for update; 

которая производит такую ​​же ошибку. Удаление для обновления; из запроса позволяет выполнить запрос без ошибок.

Я не уверен, что я делаю неправильно, и попробовал все, что мог придумать. Пожалуйста, помогите мне понять, что мне не хватает!

Благодаря

ответ

0

Большую часть времени, MySQL будет обрабатывать таблицы или блокировку строки при использовании транзакции (InnoDB типизированных).

//Doing transactions 
mysql_query("SET AUTOCOMMIT=0"); 
mysql_query("START TRANSACTION"); 
$query = "SELECT svalue FROM `test` WHERE skey='key2'"; 

if($query) 
{ 
    mysql_query("COMMIT"); 
}else{ 
    mysql_query("ROLLBACK"); 
} 
+0

Моя цель состоит в том, чтобы выбрать существующее значение из таблицы, затем увеличить и обновить при этом убедитесь, что другой процесс не прочитал старое значение до завершения обновления. Большинство моих исследований указывали на «Для обновления» для этого сценария, есть ли преимущество в использовании транзакций? – Jimmyb

+0

@ foxns7: op действительно правильный, чтобы заблокировать строку. Параллельная транзакция может изменить ее. –

0

Заблокирование за пределами сделки в основном бессмысленно. Вероятно, это объясняет синтаксическую ошибку.

Btw, если вы просто ищет для увеличения столбца значения (комментарий), просто обновить его непосредственно:

update tbl set col = col + 1 where ... 
+0

Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно знать новое значение, в котором был обновлен col. Я не смог найти выражение «Обновить и вернуть значение», например, Postgres. И я пытался следить за кодом на странице dev.mysql.com, указанном в моем вопросе, который показывает этот пример: SELECT counter_field FROM child_codes FOR UPDATE; UPDATE child_codes SET counter_field = counter_field + 1; Мне нужно обернуть это в транзакцию, это моя проблема? – Jimmyb

+0

Да, это, вероятно, проблема. В стороне, если вы хорошо знаете Postgres, чтобы знать о возврате обновлений, есть ли конкретная причина, по которой вы хотите вернуться в MySQL? :-) –

+0

К сожалению, MySQL не мой выбор в этом конкретном проекте ... всегда обязателен для «полномочий, которые есть». – Jimmyb

Смежные вопросы