Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2010, 15:59   #1
masterdela
Пользователь
 
Аватар для masterdela
 
Регистрация: 28.01.2008
Сообщений: 66
По умолчанию Ключ последней обновленной записи

Доброго времени суток!

Есть необходимость получить ключ последнее измененной записи с помощью UPDATE. А точнее сначала обновить запись, потом ее выбрать. Очень важна точность и скорость, т.к. с таблицей одновременно работают 20 человек, в таблице 100 тыс. записей.

Не нашел встроенного решения, потому на данный момент думаю в сторону следующей структуры:

r = генерим случайное число;

Код:
UPDATE TOP 1 Table SET Field1 = r
SELECT * FROM Table WHERE Field1 = r
Была бы цель - и всё получится!
masterdela вне форума Ответить с цитированием
Старый 16.12.2010, 16:03   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

А какая СУБД?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.12.2010, 13:58   #3
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

вот сижу 2й день и пытаюсь понять - что же на самом деле хотел ТС?
если запись меняли, то у нее есть ключевое поле, по которому ее подтягивали для изменений, иначе поменяют не одну конкретную запись, а несколько или вообще все
если нужны записи, которые поменял кто-то и совсем недавно, то в субд есть временные штампы - нужно под это дело завести отдельную колонку в табличке, например, date_modified date и туда на триггере при апдейте писать sysdate (или что там предусмотрено вашей субд - дату и время в одном поле) и плюс к этому еще и писать юзера, внесшего изменения (опять же многие субд имеют эти сведения)
soleil@mmc вне форума Ответить с цитированием
Старый 17.12.2010, 14:44   #4
masterdela
Пользователь
 
Аватар для masterdela
 
Регистрация: 28.01.2008
Сообщений: 66
По умолчанию

Serge_Bliznykov
Мои извинения, сервер MS SQL 2000.

soleil@mmc
Сегодня как раз думал о том, чтобы при update в доп. поле вписывать уникальный ID, составленный из дата-время-юзер. Только не user БД, а id, под которым зашли на веб-интерфейс. Думая трезво, понимаю, что это самый точный и надеженый способ из мне известных, но самый ли быстрый...

Цитата:
если запись меняли, то у нее есть ключевое поле, по которому ее подтягивали для изменений, иначе поменяют не одну конкретную запись, а несколько или вообще все
Для этого есть UPDATE TOP (1) Table. Потому ключ неизвестен.

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

Код:
RecordSet = SELECT * FROM Table WHERE Status=0
UPDATE Table SET Status=1 WHERE id = RecordSet("id").Value
Так все работало без проблем. Но когда появился случай, когда одновременно работают 20 человек с таблицей со 100 тыс. записей, получается, что за промежуток между SELECT и UPDATE успевает сработать выборка от другого юзера и выбирается эта же строка, которую уже выбрал предыдущий пользователь, но интерфейс не успел ее "заблокировать" ... Вот так получается, что одна и та же строка попадает нескольким юзерам.

Потому, пока не вижу другого выхода, как сначала унифицировать и заблочить запись, а потом выбрать ее для работы. Есть ли другое решение ?
Была бы цель - и всё получится!

Последний раз редактировалось masterdela; 17.12.2010 в 16:29.
masterdela вне форума Ответить с цитированием
Старый 17.12.2010, 16:07   #5
masterdela
Пользователь
 
Аватар для masterdela
 
Регистрация: 28.01.2008
Сообщений: 66
По умолчанию

Упс. Теоретически где-то читал про конструкцию вида
Цитата:
UPDATE TOP (1) Table Set Status=1
Практически оказалось, что такого нет в MS SQL 2000, а только начиная с 2005. А поиск лишь дал тоже самое, что у меня и сейчас есть, только одним запросом:

Цитата:
UPDATE Table SET Status=1 WHERE ID IN (SELECT TOP 1 ID FROM Table WHERE Status=0)
Насколько такой подход лучше покажут тесты.
Была бы цель - и всё получится!

Последний раз редактировалось masterdela; 17.12.2010 в 16:28.
masterdela вне форума Ответить с цитированием
Старый 17.12.2010, 17:55   #6
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

кто о чем, а вшивый о бане...
сначала ответьте на вопрос "зачем это все нужно?"
я не изучал механизма блокировок/защелок на мсскуэле, но есть подозрение что все несколько проще чем тут приведено
нужно лочить записи при редактировании?
ну и делай при попытке открыть запись на редактирование так:
1) попытка залочить запись
update table set lock_user = user where id = ... and lock_user is null
2) далее проверка кем реально залочена запись
select lock_user from table where id = ...

и дальше если это текущий юзер, то разрешать редактировать, если нет, то бай-бай
и не забыть разлочить запись после редактирования
soleil@mmc вне форума Ответить с цитированием
Старый 17.12.2010, 22:17   #7
masterdela
Пользователь
 
Аватар для masterdela
 
Регистрация: 28.01.2008
Сообщений: 66
По умолчанию

soleil@mmc
Я вроде бы максимально описал, что мне нужно (2 поста выше). Вы совсем о другом мне говорите. Под "заблочить" я имею ввиду изменить поле Status=1, по которому она была выбрана, чтобы под следующую выборку SELECT TOP 1 * FROM Table WHERE Status=0 она не попала.
Была бы цель - и всё получится!

Последний раз редактировалось masterdela; 17.12.2010 в 22:19.
masterdela вне форума Ответить с цитированием
Старый 18.12.2010, 15:47   #8
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Цитата:
если запись меняли, то у нее есть ключевое поле, по которому ее подтягивали для изменений, иначе поменяют не одну конкретную запись, а несколько или вообще все

Для этого есть UPDATE TOP (1) Table. Потому ключ неизвестен.
я не в теме что это за хрень, но выглядит она головоломно
я так понял что вы там нашли себе что-то где-то в кач-ве возможного решения и теперь уперлись в его реализацию
я же просто смотрю со стороны:
есть обновленная запись, у нее есть пара полей со штампом времени изменения и тем кто их сделал
делаем запрос с сортировкой/фильтрацией по дате-время и пользователю и вот наш курсор из н-записей (>=0)
о какой производительности идет речь если система нагруженная? здесь нужно обрабатывать данные пошагово - пока выполняется ваш любой запрос юзеры уже вбивают свои изменения и отправляют их на сервак. в данном случае получается классический стек.
только остается неясным вопрос - ну получили инфу о последней обновленной записи и что с ней дальше делать? может достаточно будет триггер заюзать? или в мсскуле с триггерами беда?
soleil@mmc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выборка по последней дате Ceme4kin Microsoft Office Access 2 12.11.2010 19:51
отображение последней ячейки столбца hipper Microsoft Office Excel 4 12.07.2010 13:40
Чтение из типизированного файла с последней записи и до первой vmilyoshin Помощь студентам 7 28.04.2010 15:34
присвоить переменной значение поля в последней записи таблицы KaimNotark БД в Delphi 1 03.02.2010 07:21
Поиск последней записи в определенной строке Maxx Microsoft Office Excel 5 04.03.2009 14:01