Мы много используем MySQL с механизмом хранения и транзакциями InnoDB, и у нас возникла проблема: нам нужен хороший способ эмуляции SEQUENCE в Oracle. Требования: - параллелизм поддержка - безопасность транзакций - максимальная производительность (что означает сведение к минимуму замки и тупиков)Эмуляция безопасной транзакции SEQUENCE в MySQL
Мы не волнует, если некоторые из значений не будет использоваться, то есть пробелы в последовательности в порядке. Существует простой способ архивирования, создавая отдельную таблицу InnoDB со счетчиком, однако это означает, что он примет участие в транзакции и будет вводить блокировки и ждать. Я собираюсь попробовать таблицу MyISAM с ручными замками, любыми другими идеями или передовыми методами?
Спасибо - это более или менее то, что мы придумали после всех - хранимая процедура, которая делает почти это. –
В случае, если запись не существует, используйте этот запрос. 'INSERT INTO sequence (seq_name, seq_current) VALUES ('foo', (@next: = 1)) ON DUPLICATE KEY UPDATE seq_current = (@next: = seq_current + 1);' then call 'SELECT @next;' – iwat
вы можете объединить комментарий iwat с ответом qu1j0t3 в: 'INSERT INTO sequences2 (seq_name, seq_current) VALUES ('Foo', LAST_INSERT_ID (1)) дублированием KEY UPDATE seq_current = last_insert_id (seq_current + 1);' затем либо вызовите 'SELECT LAST_INSERT_ID();', либо если вы используете драйвер приложения, используйте встроенный вызов автоматического инкремента (например, 'Statement # getGeneratedKeys' в jdbc) – Alden