Атомно получить и увеличить значение последовательности в MySql - PullRequest
1 голос
/ 31 марта 2011

Я конвертирую БД из Oracle в MySQL.Я использую как Java, так и Hibernate.Когда я использовал оракул, у меня был следующий метод, который дал мне совершенно новое и неиспользуемое значение последовательности:

protected int getSequenceNextValue() {
    Session session = sessionFactory.getCurrentSession();
    Query query = session.createSQLQuery("select MY_SEQUENCE.NEXTVAL from DUAL");
    return ((BigDecimal) query.uniqueResult()).intValueExact();
}

И я пытаюсь реорганизовать этот метод для работы с БД MySQL.У меня есть таблица в MySQL, которую я использую как последовательность (через Hibernate):

create table MY_SEQUENCE(
    next_val int(10) NOT NULL
);

Есть ли какой-нибудь потокобезопасный способ получить новое значение из этой таблицы и в том же преобразовании увеличить его?

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

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

Спасибо ...

1 Ответ

0 голосов
/ 31 марта 2011

Посмотрите на тип таблицы InnoDB и FOR UPDATE.Пример, подобный тому, что вы описываете, находится в руководстве MySQL здесь http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

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