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

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

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
new01
Отправлено: 15 Ноября, 2019 - 02:12:07
Post Id



Посетитель


Покинул форум
Сообщений всего: 301
Дата рег-ции: Июнь 2010  
Откуда: Челябинск


Помог: 1 раз(а)




Здравствуйте!

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

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


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

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

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

P.S. модераторы, поменяйте название темы на "Одновременное изменение одной записи в Mysql БД с разных соединений", пожалуйста! Спасибо.

(Отредактировано автором: 15 Ноября, 2019 - 02:14:53)



-----
new01
 
 Top
Мелкий Супермодератор
Отправлено: 15 Ноября, 2019 - 11:56:01
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




именно `field` = `field` + '$value - не может. Транзакции имеют явный конфликт ресурсов и будут сериализованы самой базой данных корректно.
innodb - на блокировке строки
myisam - блокировкой таблицы

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


-----
PostgreSQL DBA
 
 Top
new01
Отправлено: 15 Ноября, 2019 - 14:16:39
Post Id



Посетитель


Покинул форум
Сообщений всего: 301
Дата рег-ции: Июнь 2010  
Откуда: Челябинск


Помог: 1 раз(а)




Мелкий пишет:
именно `field` = `field` + '$value - не может. Транзакции имеют явный конфликт ресурсов и будут сериализованы самой базой данных корректно.
innodb - на блокировке строки
myisam - блокировкой таблицы

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


Да, я вот так и думал, что если `field` = `field` + '$value, то в принципе все ок должно быть. То есть Mysql сам смотрит, что сейчас с этим полем происходит операция, значит надо дождаться окончания операции и обновить поле на основе новых данных? И сам составляет очередь, да?


-----
new01
 
 Top
LIME
Отправлено: 15 Ноября, 2019 - 15:41:31
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




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
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB