Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > Хранимые процедуры и многопользовательский режим


Автор: cra6 21.10.2009, 00:20
Здравствуйте,
Есть следующая задача:
Существует n хостов с n потоками.Каждый поток выбирает из одной и той же таблицы n строк и апдейтит им статус-делая их закрытыми для других потоков.Пока что есть два варианта-select for update или вызов хранимой процедуры из каждого потока.Вопрос-как это всё таки лучше сделать?И будут ли хранимые процедуры работать корректно(и каким собственно образом--первый вызвал-все остальные ждут?)Если есть ссылки на "где почитать" с радостью кликну. Спасибо.
БД- Oracle 10. + java
P.S.также надо будет делать для MSSQL. 

Автор: ToshaCh 21.10.2009, 15:57
Имхо надо писать свои блокировки.  dbms_lock и Том Кайт тебе в помощь.

Добавлено через 12 минут и 50 секунд
Более того. В оракле никогда, не при каких обстоятельствах не блокируется чтение, в отличии от старых версий MS Sql и Saybase. А вот запись работает по принципу: кто последний тот и папа. Поэтому чтобы блокировать доступ построчно нужно будет писать свою процедуру с использованием dbms_lock.

Автор: DimW 26.10.2009, 08:23
ToshaCh, а чем в данном случае select for update уступает dbms_lock - у?
разница лишь в том что одна блокировка физическая, а другая логическая.

Автор: ToshaCh 26.10.2009, 14:13
Цитата(DimW @  26.10.2009,  08:23 Найти цитируемый пост)
чем в данном случае select for update уступает dbms_lock

Может, я конечно не правильно понял задачу, но блокироваться должна не вся таблица, а какая-то её часть. А если вся то конечно ничем, кроме гемороя это отличаться не будет smile

Автор: DimW 26.10.2009, 14:34
Цитата(ToshaCh @  26.10.2009,  14:13 Найти цитируемый пост)
но блокироваться должна не вся таблица, а какая-то её часть

так for update и не блокирует все, блокируются только те строки которые выбранны, на время транзакции.

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

Автор: DimW 26.10.2009, 16:19
Цитата(cra6 @  21.10.2009,  00:20 Найти цитируемый пост)
Пока что есть два варианта-select for update или вызов хранимой процедуры из каждого потока.

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

Цитата(cra6 @  21.10.2009,  00:20 Найти цитируемый пост)
Каждый поток выбирает из одной и той же таблицы n строк и апдейтит им статус-делая их закрытыми для других потоков.

поясните.

Автор: ToshaCh 26.10.2009, 16:48
Цитата(DimW @  26.10.2009,  14:34 Найти цитируемый пост)
так for update и не блокирует все, блокируются только те строки которые выбранны, на время транзакции.

Угу. Молчу дурак. smile

Автор: cra6 27.10.2009, 00:29
Цитата(DimW @  26.10.2009,  16:19 Найти цитируемый пост)
мочему вы разделяете это на два способа

Уже не раздяляю) 
Цитата(DimW @  26.10.2009,  16:19 Найти цитируемый пост)
особенно не понятна идея изменеия статусов для блокирования.

Потоками выбираются записи только с определённым статусом.Записи блокируются, у них меняется статус, они разблокируются и после этого происходит их обработка.По моему это проще чем держать блокировку всё время до конца обработки.(Обработка дстаточно сложная)
Цитата(DimW @  26.10.2009,  16:19 Найти цитируемый пост)
по мне так - необходимо реализовать процедуру в которой используется for update.

Процедура в данном случае лучше чем просто запросы?Если не сложно приведите пожалуйста пару аргументов в пользу данного подхода.Будет ли существенная польза?

Автор: Zloxa 27.10.2009, 02:18
Цитата(cra6 @  27.10.2009,  00:29 Найти цитируемый пост)
Процедура в данном случае лучше чем просто запросы?Если не сложно приведите пожалуйста пару аргументов в пользу данного подхода.Будет ли существенная польза? 

Логика работы с данными остается на сервере БД. Процедура являет собой интерфейс для приложения. Много проще будет в дальнейшем сопровождать и модернизировать.

Автор: DimW 28.10.2009, 10:00
Цитата(cra6 @  27.10.2009,  00:29 Найти цитируемый пост)
Процедура в данном случае лучше чем просто запросы?

просто вы сами завели разговор о процедурах, вот я и привел пример. если вы реализуете все логику на java то может и нет смысла выносить механизм блокирования на сторону БД. во всяком случае я сторонник того что бы логика была в одном месте, а вообще 
Zloxa, все сказал и я разделяю его мнение.

Добавлено через 11 минут и 21 секунду
Цитата(cra6 @  21.10.2009,  00:20 Найти цитируемый пост)
Существует n хостов с n потоками.

 smile Ё моЁ конечно же процедура!!!  как вы с кучи хостов собрались блокировать данные если логика реализована не в БД.

Автор: cra6 28.10.2009, 15:03
Цитата(DimW @  28.10.2009,  10:00 Найти цитируемый пост)
Ё моЁ конечно же процедура!!!  как вы с кучи хостов собрались блокировать данные если логика реализована не в БД. 

Простите, не понял. Я не против процедур просто интересно -  блокировать с разных хостов запросами for update нельзя? Обьясните, пожалуйста.(используется java + hibernate + spring)

Автор: DimW 28.10.2009, 15:14
Цитата(cra6 @  28.10.2009,  15:03 Найти цитируемый пост)
блокировать с разных хостов запросами for update нельзя? 

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

Автор: cra6 28.10.2009, 17:06
Ясно.Спасибо за помощь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)