Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как лучше получить идентификатор / 5 сообщений из 5, страница 1 из 1
05.09.2013, 07:14:21
    #38387360
Jura.K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше получить идентификатор
Добрый день уважаемые Гуру.
Итак возникла такая необходимость получить идентификатор внутри транзакции. Но наступил на грабли (на свои грабли)
Суть в следующем имеем таблицу InnoDB, с которой работаем в режиме ручного управления транзакциями.


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
START TRANSACTION ;
-- ..... тут что то делаем 
-- ..... здесь нужно получить уникальный идентификатор, 
-- т.к. он должен быть уникальным т.е. на него не должно действовать ROLLBACK, 
-- я то наивный думал ну буду делать запрос следующего вида 
UPDATE sequence SET id=LAST_INSERT_ID(id+1) ;
SELECT LAST_INSERT_ID() AS NEWID FROM sequence ;
-- а таблицу sequence делаем типа MyISAM 
-- ..... здесь опять идет проверка (возможен вызов еще одной вставки с получением одного или нескольких идентификаторов.
--  ну и собственно проверка, по результатам которой 
COMMIT ;
или 
ROLLBACK ;



Все бы было хорошо, но беда в том, что если по таблице myISAM делать UPDATE из транзакции, то она лочиться до тех пор, пока транзакция не завершиться.
Я понимаю что можно завести новое подключение к базе и в нем получать идентификатор (ну это как крайний выход).
Может кто нибудь подскажет как можно выйти из этой ситуации, одним подключением, без LOCK таблицы идентификаторов?
...
Рейтинг: 0 / 0
05.09.2013, 07:52:44
    #38387370
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше получить идентификатор
делаете таблицу сиквенс на иннодб (с одним полем - ид праймари автоинкремент)
при вставке в него пустого значения ласт_инсерт_ид будет давать вам новый айдишник
дополнительный плюс - несколько писателей друг с другом не столкнутся
...
Рейтинг: 0 / 0
05.09.2013, 08:09:03
    #38387374
Jura.K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше получить идентификатор
tanglir,

писатель 1
Транзакция начата
вставка в Siquence формата InnoDB


в это время писатель 2 решил то же вставить в эту таблицу значение (получить идентификатор)
он будет сидеть и ждать пока у первого не закончится транзакция ? Не? или я что то не догоняю?

Т.е. результат ровно такой же что и с таблицей myISAM, второй писатель ждет окончания транзакции первого.

Наверно выход только один, для получения идентификатора использовать второе соединение.
...
Рейтинг: 0 / 0
05.09.2013, 08:27:25
    #38387383
Jura.K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше получить идентификатор
tanglirделаете таблицу сиквенс на иннодб (с одним полем - ид праймари автоинкремент)
при вставке в него пустого значения ласт_инсерт_ид будет давать вам новый айдишник
дополнительный плюс - несколько писателей друг с другом не столкнутся

А точно заклинило меня на UPDATE, вставку ждать не будет и автоинкремент отработает правильно.
Одна засада таблица Sequence будет расти. Придется периодически ее чистить.
Спасибо действительно так и надо сделать
...
Рейтинг: 0 / 0
05.09.2013, 08:31:56
    #38387386
Jura.K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше получить идентификатор
tanglirделаете таблицу сиквенс на иннодб (с одним полем - ид праймари автоинкремент)
при вставке в него пустого значения ласт_инсерт_ид будет давать вам новый айдишник
дополнительный плюс - несколько писателей друг с другом не столкнутся

А точно заклинило меня на UPDATE, вставку ждать не будет и автоинкремент отработает правильно.
Одна засада таблица Sequence будет расти. Придется периодически ее чистить.
Спасибо действительно так и надо сделать
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как лучше получить идентификатор / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]