Являются ли отдельные операторы mysql атомарными в MyISAM и InnoDB? - PullRequest
6 голосов
/ 12 октября 2011

Например, у меня есть строка со столбцом C1 value = 'clean', и два разных клиента выполняют этот запрос одновременно :

update T1 set C1 = 'dirty' where Id = 1

Без использования транзакций гарантируется ли независимо от типа механизма , что значение mysql_affected_rows() будет равно 1 для одного клиента и 0 для другого?

Ответы [ 2 ]

11 голосов
/ 12 октября 2011

Да и Нет: -)

В обоих случаях доступ сериализуется (при условии, что вы используете транзакционный механизм, такой как InnoDB), поскольку они попадают в одну строку, поэтому онине будет мешать друг другу.Другими словами, операторы являются атомарными.

Однако количество затронутых строк на самом деле зависит от вашего набора конфигурации при открытии соединения.Страница для mysql_affered_rows () может сказать следующее (мое выделение жирным шрифтом):

Для операторов UPDATE значение затрагиваемых строк по умолчанию - это количество строк на самом деле изменен .Если вы указали флаг CLIENT_FOUND_ROWS для mysql_real_connect () при подключении к mysqld, значение затрагиваемых строк будет числом строк "найдено" ;то есть соответствует предложению WHERE.

И с на странице mysql_real_connect :

CLIENT_FOUND_ROWS: Возвращает количество найденных (совпавших) строк, а не количество измененных строк.

Итак, с точки зрения того, что происходит с настроенной CLIENT_FOUND_ROWS,затронутые строки для:

UPDATE T1 SET C1 = 'dirty' WHERE id = 1

имеют ничего в зависимости от того, изменились ли данные , только для каких строк соответствует. Это будет1 для обоих запросов.

С другой стороны, если CLIENT_FOUND_ROWS было установлено , а не , второй запрос фактически не будет изменять строку (так как он уже заполнен 'грязным')и будет иметь количество строк, равное нулю.

Если вы хотите, чтобы было одинаковое поведение независимо от этого параметра (отображались только изменения), вы могли бы использовать что-то вроде:

UPDATE T1 SET C1 = 'dirty' WHERE id = 1 AND C1 <> 'dirty'
3 голосов
/ 12 октября 2011

MySQL совместим с ACID, если вы используете механизм хранения транзакций, такой как InnoDB.

...