| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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, 14:34 |
так for update и не блокирует все, блокируются только те строки которые выбранны, на время транзакции. я просто думал что есть аргументы почему в данном случае логическая блокировка предпочтительней физической. |
| Автор: ToshaCh 26.10.2009, 16:48 | ||
Угу. Молчу дурак. |
| Автор: cra6 27.10.2009, 00:29 | ||
Уже не раздяляю) Потоками выбираются записи только с определённым статусом.Записи блокируются, у них меняется статус, они разблокируются и после этого происходит их обработка.По моему это проще чем держать блокировку всё время до конца обработки.(Обработка дстаточно сложная)
Процедура в данном случае лучше чем просто запросы?Если не сложно приведите пожалуйста пару аргументов в пользу данного подхода.Будет ли существенная польза? |
| Автор: Zloxa 27.10.2009, 02:18 | ||
Логика работы с данными остается на сервере БД. Процедура являет собой интерфейс для приложения. Много проще будет в дальнейшем сопровождать и модернизировать. |
| Автор: DimW 28.10.2009, 10:00 |
просто вы сами завели разговор о процедурах, вот я и привел пример. если вы реализуете все логику на java то может и нет смысла выносить механизм блокирования на сторону БД. во всяком случае я сторонник того что бы логика была в одном месте, а вообще Zloxa, все сказал и я разделяю его мнение. Добавлено через 11 минут и 21 секунду |
| Автор: cra6 28.10.2009, 15:03 | ||
Простите, не понял. Я не против процедур просто интересно - блокировать с разных хостов запросами for update нельзя? Обьясните, пожалуйста.(используется java + hibernate + spring) |
| Автор: DimW 28.10.2009, 15:14 |
можно, но если я правильно все понимаю, то это дублирование метода блокировки на каждом хосте, а это означает что в один прекрасный момент они станут разными - со всеми вытикающими... или у вас архитектура не такая как я подумал? |
| Автор: cra6 28.10.2009, 17:06 |
| Ясно.Спасибо за помощь. |