sql параллельные запросы без блокировок

A5
На сайте с 19.04.2009
Offline
74
1422

допустим есть таблица

id| data

----------

0 | qwe

1 | asd

2 | zxc

...

можно ли средствоми sql отдавать данные по порядку при множестве параллельных

запросов?

притом надо чтобы одна строка была выдана только 1 раз

подскажите пару ключевых слов по которым лучше погуглить

properads.ru (https://properads.ru)
HapKOTuK
На сайте с 23.08.2007
Offline
30
#1

ИМХО без блокировки - никак.

Но ты опиши задачу подробнее, может найдём выход.

Не будь слишком требователен к себе - будешь неудовлетворен. Не будь слишком требовательным к другим - разочаруешься.
creator123
На сайте с 19.06.2008
Offline
103
#2

а я ничего не понял, что хочется.

1) по какому порядку?

2) что значит только один раз? Откуда возьмется второй раз?

3) что значит sql? mysql? mssql? firebirdSQL? postresql?

4) и причем тут вообще блокировка? И блокировка чего?

N
На сайте с 06.05.2007
Offline
419
#3

Скорее всего имеется ввиду концепция "очередь заданий для множества паралельных обработчиков". Типичная схема работы парсера.

Если задания выполняются паралельно и они быстро заканчиваются, то неплохо бы обойтись без блокировки. Каждый обработчик может пометить свое задание через UPDATE и работать с ним.

Делайте так :

каждый обработчик имеет свой уникальный идентификатор (очевиднее всего взять PID процесса или потока).

update queue1 set state=1,worker_id=$pid where state=0 .. order by .. limit 1;

select * from queue1 where worker_id=$pid and state=1 limit 1;

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

но в Дефолтной СУБД(mysql) с Дефолтным Движком (myisam) все будет хорошо.

Кнопка вызова админа ()
A5
На сайте с 19.04.2009
Offline
74
#4
creator123:
а я ничего не понял, что хочется.
1) по какому порядку?
2) что значит только один раз? Откуда возьмется второй раз?
3) что значит sql? mysql? mssql? firebirdSQL? postresql?
4) и причем тут вообще блокировка? И блокировка чего?

прошу прощения, возможно я чего-то сам не понимаю

1)порядок определяется по полю id

2)если есть несколько параллельных запросов то не должно случиться так, что

одна строка таблицы была бы выдана нескольким клиентам

3)допустим постгрес или mysql.

4)блокировка таблицы на время обработки каждого запроса

чтобы не допускать образования очередей ожидания пока это позволяет железо

приоритет выдачи одной записи только 1 раз и времени отклика выше чем приоритет отдачи записей по порядку

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

как-то так.

andrey57 добавил 01.06.2009 в 00:56

netwind,

спасибо

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий