Транзакции и блокировки в MySQL

185
10 декабря 2017, 09:42

Всем привет. Перечитал много статей по транзакциям и блокировкам в MySQL, но пока так и не понял, что следует использовать для моего случая. Имеется таблица clients с полем balance, где записан баланс пользователя. Пользователь в интерфейсе вводит сумму, которую хочет списать и в результате поле balance должно быть обновлено для данного клиента. Как защитить себя от того, что два процесса могут одновременно считать и записать данные в одну строку. Таблица MyISAM. Заранее благодарен за помощь в этом вопросе!

Answer 1

Существует явная и не явная блокировка.

  • Явная используется непосредственно самим механизмом БД при записи, чтений, обновлений данных.
  • Не явная блокировка устанавливается напрямую пользователем.

Так как у тебя механизм хранения MyISAM, то неявная блокировка будет происходить на уровне строк.
Если ты хочешь что бы твои данные были правильно записаны и считаны, то перед записью этих данных явно установи блокировку (Устанавливается на всю таблицу). А после сними ее. Пример:

LOCK TABLES clients READ LOCAL;
... производим запись (insert, update)...
UNLOCK TABLES;

Здесь:

  • LOCK TABLES - задает блокировку таблицы
  • clients - имя блокируемой таблицы
  • READ LOCAL - тип блокировки (блокирует таблицу для чтения, но позволяет осуществлять вставку данных)

P.S здесь более подробно

READ ALSO
В Yii2 dbQuery join() как написать LIMIT?

В Yii2 dbQuery join() как написать LIMIT?

Здравствуйте! При получения данные из другой таблицы с помощью JOIN нужно забрать только один елемент как это можно реализовать?

273
Использовать новую переменную в WHERE [дубликат]

Использовать новую переменную в WHERE [дубликат]

На данный вопрос уже ответили:

253
Как запретить открытие формы с данными, если она уже отрыта другими

Как запретить открытие формы с данными, если она уже отрыта другими

Есть список с даннымиНажимая 2 раза, открывается форма с этими детальными данными

226
Проблема с получением атрибутов XML C#

Проблема с получением атрибутов XML C#

Есть такой xml-документ:

247