SQL - вывести значение столбца до неотрицательного значения - PullRequest
0 голосов
/ 30 ноября 2018

Я работаю над таблицей, в которой есть столбец int, который будет вычтен, когда произойдет какое-то событие.Значение задано заранее и не может опускаться ниже нуля.

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

В настоящее время моя логика не может гарантировать, что он будет эффективно оставаться выше 0 (выбор перед обновлением не может гарантировать, что :(). Есть ли хитрость дляприменять это бизнес-правило?

Если значение недостаточно, транзакция не должна пройти.

Ответы [ 3 ]

0 голосов
/ 30 ноября 2018

Похоже, вам нужен какой-то механизм блокировки.

Эта функциональность доступна в MySQL:

  • В таблицах InnoDB реализована блокировка на уровне строк - см. эта документация

  • ISAM обеспечивает только блокировку на уровне таблицы

0 голосов
/ 30 ноября 2018

Решение 1 - использовать без знака

ALTER TABLE events MODIFY event_count INT UNSIGNED NOT NULL

Попытка уменьшить значение ниже 0 приведет к ошибке.

Решение 2 - с помощью запроса

UPDATE events SET event_count=event_count-1 WHERE event_id={X} AND event_count > 0

Посмотрите на строкипострадал, чтобы увидеть, если это произошло.

0 голосов
/ 30 ноября 2018

Вы можете изучить ограничение CHECK для MySQL.Это гарантирует, что значение столбца никогда не станет меньше нуля, и вам не потребуется проверять счетчик с помощью кода SQL.

Пример таблицы определения: -

CREATE TABLE IF NOT EXISTS events (
    event_count DECIMAL(10 , 2 ) NOT NULL CHECK(cost >= 0),
    price DECIMAL (10,2) NOT NULL
);
...