Последняя добавленная запись

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Последняя добавленная запись

Сообщение FireFenix » 01.06.2010 (Вт) 11:52

Есть приложение клиент-сервер на MSSQL...

Когда клиент добавляет в БД запись, то, чтобы добавить в интерфейс новую запись и работать с ней, нужно получить её id

Раньше делал типа
Код: Выделить всё
//id - autoincrement
INSERT INTO table SET data="data";
SELECT TOP 1 * FROM table ORDER BY id DESC;

Но т.к. это не транзакция, то может возникнуть ситуация, когда в многопоточном режиме сделается более 1 инсерта => select получит последнюю запись в бд, а не добавленную...

Как лучше организовать выбор добавленной записи?

Или всё же отдельные подобные места лучше выпилить в тразакцию? Какой уровень изоляции транзакции для таких целей лучше? Snapshot?
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Re: Последняя добавленная запись

Сообщение VVitafresh » 01.06.2010 (Вт) 17:08

Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Последняя добавленная запись

Сообщение FireFenix » 01.06.2010 (Вт) 17:24

Чёрт, дико протупил.... думал что @@Identity возвращает глобально для таблицы, а не для сеанса...

Спасибо за наводку :)
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Re: Последняя добавленная запись

Сообщение VVitafresh » 01.06.2010 (Вт) 17:42

Мне кажется, в данном случае лучше использовать SCOPE_IDENTITY:
Функции SCOPE_IDENTITY и @@IDENTITY возвращают последние значения идентификатора, созданные в таблицах во время текущего сеанса. Однако функция SCOPE_IDENTITY возвращает значения, вставленные только в рамках текущей области, тогда как действие функции @@IDENTITY не ограничивается никакими областями.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 115

    TopList