Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Одновременное изменение одной записи в Mysql БД с разных соединений
Форумы портала PHP.SU » » Вопросы новичков » Одновременное изменение одной записи в Mysql БД с разных соединений

Страниц (1): [1]
 

1. new01 - 15 Ноября, 2019 - 02:12:07 - перейти к сообщению
Здравствуйте!

У меня происходит большое количество обращений к одному полю в одной таблице и в одной записи. Причем обращения не просто посмотреть значение, а изменить его. Источники обращений: разные php скрипты (не один), то есть могут быть параллельные обращения.

Изменение значения происходит следующим стандартным образом:
CODE (SQL):
скопировать код в буфер обмена
  1. UPDATE `table` SET `field` = `field` + '$value' WHERE `id` = '$id'


И я задумался о том, что может получиться несколько одновременных обращений для изменения поля в один момент, и два параллельных потока будут прибавлять к одному значению разные параметры и просто друг друга перепишут, хотя по факту это должны выполниться последовательно.

Собственно вопрос, может ли так случиться? Либо Mysql предусмотрели это уже? Если всё же может, то что делать? Блокировать таблицу, запись, поле или...?

Заранее всем благодарен за любые Ваши ответы.

P.S. модераторы, поменяйте название темы на "Одновременное изменение одной записи в Mysql БД с разных соединений", пожалуйста! Спасибо.
2. Мелкий - 15 Ноября, 2019 - 11:56:01 - перейти к сообщению
именно `field` = `field` + '$value - не может. Транзакции имеют явный конфликт ресурсов и будут сериализованы самой базой данных корректно.
innodb - на блокировке строки
myisam - блокировкой таблицы

А вот если делаете select field, дальше что-то на приложении считается, а потом update set field = newvalue - то тут проблема конкурентного доступа будет.
3. new01 - 15 Ноября, 2019 - 14:16:39 - перейти к сообщению
Мелкий пишет:
именно `field` = `field` + '$value - не может. Транзакции имеют явный конфликт ресурсов и будут сериализованы самой базой данных корректно.
innodb - на блокировке строки
myisam - блокировкой таблицы

А вот если делаете select field, дальше что-то на приложении считается, а потом update set field = newvalue - то тут проблема конкурентного доступа будет.


Да, я вот так и думал, что если `field` = `field` + '$value, то в принципе все ок должно быть. То есть Mysql сам смотрит, что сейчас с этим полем происходит операция, значит надо дождаться окончания операции и обновить поле на основе новых данных? И сам составляет очередь, да?
4. LIME - 15 Ноября, 2019 - 15:41:31 - перейти к сообщению
new01 пишет:
И сам составляет очередь, да?
да
выставляется флаг блокировки строки/таблицы на запись и остальные запросы на запись ждут его снятия в очереди, чтобы также выставить перед своей записью
тоесть совсем одновременного доступа не будет

то от чего предостерегает Мелкий называется потерянное обновление
можно обзорно глянуть в вики по запросу Уровень_изолированности_транзакц ий
так как ссылки на вики тут бьются
https://ru[dot]wikipedia[dot]org/wiki/%D[dot][dot][dot]1%86%D0%B8%D0%B9
(Добавление)
примерно понять механизм можно тут
очень хорошо разжеванно для новичка в уровнях изоляции хотя и на примере SQL Server
https://www[dot]youtube[dot]com/watch?v=iGsbXLgZMlo

 

Powered by ExBB FM 1.0 RC1