powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Всю голову сломал
17 сообщений из 17, страница 1 из 1
Всю голову сломал
    #36841281
Фотография Galant
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Други, кто может помочь - сир ву пле:

Исходные данные:
1. Имеется SQL-таблица со столбцами ID и varchar(255);
2. N клиентов (с разных машин и несколько потоков с одной) могут делать SELECT и брать любую строку на обработку (т.е просто SELECT и результаты уже в других таблицах);

Задача: Что сделать, чтобы клиент не мог брать строки, уже взятые другим клиентом?
Существенных ограничений нет: можно создать доп. колонку, хранимую процедуру и т.п. В общем, всё во власти разработчика.
...
Рейтинг: 0 / 0
Всю голову сломал
    #36841306
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Galant,

Блокируем таблицу на чтение и запись. Получаем какую-то строку из тех для которых столбец Busy = 0. Выставляем ей Busy = 1. Разблокируем таблицу, после чего начнет работать следующий запрос в очереди, если такой имеется.
...
Рейтинг: 0 / 0
Всю голову сломал
    #36841342
web_fox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.Dragon,

хочу узнать в какой субд так приходится делать?
...
Рейтинг: 0 / 0
Всю голову сломал
    #36841362
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
web_foxEdd.Dragon,

хочу узнать в какой субд так приходится делать?
Сначала предложите свой способ. А то я других не знаю, как не дать заселектить то, что пять минут назад сосед заселектил.
...
Рейтинг: 0 / 0
Всю голову сломал
    #36841529
905
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Всю голову сломал
    #36841664
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
905Galant,

SELECT ... FOR UPDATE http://www.postgresql.org/docs/8.4/static/sql-select.html

Если бы автор конкретизировал задачу и уточнил, на сколько долго факт блокирования должен сохраняться, т.е. если ситуация сходная с созданием новой записи, то да, то что надо. А если необходима железная фиксация факта блокировки в момент блокировки на возможно длительное время и недопустим сброс этой информации в случае например приостановки SQL-сервера, тогда не пойдет.


P.S.: Я кстати об этой конструкции давно забыл оказывается. Дело в том, что давно пишу на MySQL и заказчики требуют совместимости с нетранзакционным MyISAM, который естественно ее не поддерживает, в итоге давно с ней в коде не сталкивался. А транзакционные движки под MySQL поддерживают. А то по началу хотел было заявить, что в MySQL не пройдет этот "фокус" ))))
...
Рейтинг: 0 / 0
Всю голову сломал
    #36841666
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, насколько имеет значение количество незакрытых транзакций в конкретный момент времени? Есть ли какие-нибудь ориентировочные взаимосвязи количества заблокированных строк и производительности селектов? Для MS SQL или MySQL, Оракла - не важно, инфа будет полезной
...
Рейтинг: 0 / 0
Всю голову сломал
    #36841669
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. ответ на вопрос

web_foxхочу узнать в какой субд так приходится делать?

При использовании нетранзакционной модели, например в MySQL с движком MyISAM.
...
Рейтинг: 0 / 0
Всю голову сломал
    #36841762
Alexsalog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Написать сохраненную процедуру в которой выполняется "пометка" таких записей для выборки:

Код: plaintext
1.
2.
3.
insert into buzy_ids select ID, @user from atable 
where (..условие выборки..) 
and Id not in (select ID from busy_ids where user != @user)

И потом выбирать эти записи в любое время имея "отмеченные" Id.

Если записи уже заняты, то благодаря условию Id not in (select ID from busy_ids where user != @user) второй раз занять их не получится.
...
Рейтинг: 0 / 0
Всю голову сломал
    #36841781
web_fox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.DragonТ.е. ответ на вопрос

web_foxхочу узнать в какой субд так приходится делать?

При использовании нетранзакционной модели, например в MySQL с движком MyISAM.

Ясно. Медленно это всё будет работать. Человек, похоже, на ASP пишет, так что вряд ли это mysql, хотя он и не указал.

Да и в вашем решении не нужно ничего блокировать, сразу апдейтить по условию.
...
Рейтинг: 0 / 0
Всю голову сломал
    #36842288
Фотография Galant
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Други, большое спасибо за ваши предложения!

Действительно, забыл указать БД - это MS SQL Server 2008.

Edd.Dragon , блокировать всю таблицу нельзя, т.к. другим клиентам тоже надо делать из неё SELECT.

905 , по всей видимости то, что нужно, но увы, есть только в Postgres.

Alexsalog , решение элегантное, но в случае двух потоков на одном клиенте, боюсь, SELECT-ы будут пересекаться.


В общем, как-то я подхожу к идее, что нужно писать раздатчик (но, ох, как не хочется).
...
Рейтинг: 0 / 0
Всю голову сломал
    #36842671
web_fox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GalantДруги, большое спасибо за ваши предложения!

Действительно, забыл указать БД - это MS SQL Server 2008.

Edd.Dragon , блокировать всю таблицу нельзя, т.к. другим клиентам тоже надо делать из неё SELECT.

905 , по всей видимости то, что нужно, но увы, есть только в Postgres.

Alexsalog , решение элегантное, но в случае двух потоков на одном клиенте, боюсь, SELECT-ы будут пересекаться.


В общем, как-то я подхожу к идее, что нужно писать раздатчик (но, ох, как не хочется).

А чем не нравится "апдейтить по условию"? Два варианта:
1. update where "не занято" returning id - просто обновляете флаг. на выходе id строки, которую заняли.
2. update "устнавить id занимающего процесса" where "не занято".

В решении Alexsalog селекты пересекаться не будут - они же выполняются атомарно с инсертами. Вам нужно серьёзно почитать мануал, т.к. есть непонимание азов.
...
Рейтинг: 0 / 0
Всю голову сломал
    #36842674
web_fox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, у решения Alexsalog огромный плюс - оно не обновляет исходную таблицу.
...
Рейтинг: 0 / 0
Всю голову сломал
    #36843134
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Galant
Edd.Dragon , блокировать всю таблицу нельзя, т.к. другим клиентам тоже надо делать из неё SELECT.

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

Но раз MS SQL, то как и говорили выше - SELECT ... FOR UPDATE можно.
...
Рейтинг: 0 / 0
Всю голову сломал
    #36843290
Фотография Galant
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
web_fox , хорошо, проверю решение Alexsalog на реальных данных и займусь чтением мануала :)

Edd.Dragon , в голову приходит только инструкция OUTPUT, которая вроде как даёт узнать что проапдейтилось.
...
Рейтинг: 0 / 0
Всю голову сломал
    #36848151
Ага
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
От чтения грязных данных на уровне сервера не защиты нет.
На уровне приложения решить можно следующим образом:
Читать всегда с уровнем изоляции read uncommitted, при необходимости блокировки набора записей или для чтения "чистых" данных хинтами повышать уровень изоляции до read committed.
Написать свой механизм блокировок или версионности тоже можно :), боюсь пойдете дорогой разочарований.
В любом случае успехов.
...
Рейтинг: 0 / 0
Всю голову сломал
    #36848881
Фотография Galant
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока сделал что-то похожее на предложенное Alexsalog, только в одной таблице и использованием UPDATE ... OUTPUT.
Три потока, запущенные одновременно с одной машины получают разные строки для обработки.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Всю голову сломал
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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