MySQL транзакция и триггеры - PullRequest
0 голосов
/ 15 ноября 2010

Эй, ребята, вот что я не могу понять.У нас есть таблица в базе данных, куда PHP вставляет записи.Я создал триггер для вычисления значения для вставки.Вычисленное значение должно быть уникальным.Однако время от времени случается, что у меня есть одно и то же число для нескольких строк в таблице.Число представляет собой комбинацию года, месяца и дня и номера заказа на этот день.Я думал, что одна операция вставки является атомарной, и таблица заблокирована во время транзакции.Мне нужно, чтобы вычисленное значение было уникальным ... Сервер версии 5.0.88.Сервер Linux CentOS 5 с двухъядерным процессором.

Вот триггер:

CREATE TRIGGER bi_order_data BEFORE INSERT ON order_data
FOR EACH ROW BEGIN
  SET NEW.auth_code = get_auth_code();
END;

Соответствующая процедура выглядит следующим образом:

CREATE FUNCTION `get_auth_code`() RETURNS bigint(20)
BEGIN
    DECLARE my_auth_code, acode BIGINT;
    SELECT MAX(d.auth_code) INTO my_auth_code
        FROM orders_data d
        JOIN orders o ON (o.order_id = d.order_id)
        WHERE DATE(NOW()) = DATE(o.date);

    IF my_auth_code IS NULL THEN
        SET acode = ((DATE_FORMAT(NOW(), "%y%m%d")) + 100000) * 10000 + 1;
    ELSE
        SET acode = my_auth_code + 1;
    END IF;
    RETURN acode;
END

1 Ответ

2 голосов
/ 27 февраля 2011

Я думал, что одна операция вставка атомарна и таблица заблокирована во время транзакции

Либо таблица заблокирована (используется MyISAM), либо могут быть заблокированы записи (используется InnoDB), но не оба.

Поскольку вы упомянули "транзакция", я предполагаю, что InnoDB используется. Одним из преимуществ InnoDB является отсутствие блокировок таблицы, поэтому ничто не помешает одновременному выполнению многих тел триггеров и получению одинакового результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...