Условия гонки MyISAM / LOCK TABLES - PullRequest
0 голосов
/ 20 марта 2019

Моя таблица "счетов-фактур":

CREATE TABLE `invoices` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `invoice_id` int(11) NOT NULL,
 PRIMARY KEY (`id`,`invoice_id`),
 UNIQUE KEY `invoice_id` (`invoice_id`),
 KEY `order_id` (`order_id`)
) ENGINE=MyISAM AUTO_INCREMENT=115 DEFAULT CHARSET=utf8

Когда я пытаюсь выполнить запрос:

mysqli_query($conn, "LOCK TABLES 'invoices' WRITE");

в сценарии php, он не работает, так как я могу вставить новую строкув «заблокированной» таблице, используя SQL-консоль phpMyAdmin во время блокировки.

Могу ли я быть полностью уверен, что такой запрос

INSERT INTO `invoices` (`invoice_id`) SELECT MAX(`invoice_id`)+100 FROM `invoices`

может успешно предотвратить условия гонки, поэтому использовать его вместо запроса LOCK TABLES;

ПРИМЕЧАНИЯ:

  • Я не создал эту таблицу.
  • Я не могу изменить таблицу.

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

Когда вы пишете SQL-запрос, вы должны переносить имена таблиц | столбцов с обратными галочками, но без одинарных кавычек.

В вашем случае

 mysqli_query($conn, "LOCK TABLES `invoices` WRITE");

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

Гонки могут быть большой проблемой для некоторых проектов.Но я сомневаюсь, что это ваш случай.Я бы поддержал комментарий @Dave, у вас уже есть автоматически увеличенный индекс.Этого более чем достаточно во многих случаях.

Имхо, вам не нужны эти "блокировки".

INSERT INTO `invoices` (`invoice_id`) SELECT MAX(`invoice_id`)+100 FROM `invoices`

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

0 голосов
/ 20 марта 2019

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

...