2012-04-14 2 views
0

У меня есть таблица потока (таблица памяти) и скрипт, который вставляется в эту таблицу (от 1 строки/мин до 100 строк/сек). Мне нужно получить 1000 строк каждые 5 секунд, я имею в виду выбор лучших 1000 строк, а затем удаление выбранных строк.Как я могу получить (выбрать затем удалить) из таблицы базы данных?

Мой запрос на выборку так просто:

SELECT * FROM vdp_stream WHERE user=xxx 

Моя проблема на самом деле я не могу сделать запрос DELETE SQL, потому что, возможно, некоторые новые строки добавляются между тем, когда я SELECT и DELETE. Я прав? Есть ли решение для извлечения строк из таблицы?

UPDATE моя структура таблицы:

vdp_stream 
--------------------- 
user CHAR(30) 
x INT 
y INT 
+1

Какова структура таблицы? Похоже, вы должны использовать систему обмена сообщениями, а не RDBMS для этой задачи. – nnichols

+0

Да, я знаю, что это звучит плохо с РСУБД, но мне нужно знать какое-либо решение для подобных ситуаций в базах данных РСУБД. –

ответ

1

Если вы будете продолжать делать это, используя таблицу, я предложил бы использовать UPDATE, SELECT и DELETE заявления в рамках транзакции. Нечто подобное возможно -

START TRANSACTION; 

UPDATE vdp_stream 
SET selected = 1 
ORDER BY id ASC 
LIMIT 1000; 

SELECT * 
FROM vdp_stream 
WHERE selected = 1; 

DELETE 
FROM vdp_stream 
WHERE selected = 1; 

COMMIT; 

UPDATE - как уровень изоляции по умолчанию для InnoDB повторим READ можно опустить обновление и просто сделать SELECT, и DELETE на основании тех же критериев -

START TRANSACTION; 

SELECT * 
FROM vdp_stream 
ORDER BY id ASC 
LIMIT 1000; 

DELETE 
FROM vdp_stream 
ORDER BY id ASC 
LIMIT 1000; 

COMMIT; 
+0

Мне действительно нужно, чтобы 'selected'? Если таблица заблокирована во время транзакции, зачем мне этот столбец? –

+1

Я обновил свой ответ с помощью другого варианта – nnichols

Смежные вопросы