Транзакции и Локи проблема с использованием

MaxDmt
Дата: 31.05.2004 13:30:12
Скажем 20 пользователей выписывают расходные накладные, причем иногда один и тот же товар с одного склада.
т.е. для отчетов таблица не блокируется, а для запросов с целью списания блокируется, чтобы не списать больше чем есть. Но проблема в том. что не круто блокировать всю таблицу, нужно только конкретные записи(остатки и обороты которые используются для вычисления остатков).
Так как все это делается параллельно, ( если я не ошибаюсь For update также делается параллельно) может возникнуть ситуация deadlock. 1 пользов- блокирует товар 1 и на очереди товар 2, а 2 пользов- уже заблокировал товар 2, 3,4 и на очереди товар 1. Можно конечно создать служебную табл, с одним индексным полем (товар+склад), и перед списанием проверять ее на наличие блокировок товар+склад. Ее для этой операции блокировать полностью, Но наверное также не круто, потомучто одна на всех, блокируется да еще и в режиме update/insert. А если пользователей больше?
Такую таблицу таблицу создать также проблема т.к. Lock снимается только после Commit.
Если на вопрос так просто не ответить бросьте в меня ссылкой где это описано.
wbear
Дата: 31.05.2004 13:56:14
а по транзакции на товат никак нельзя?
MaxDmt
Дата: 31.05.2004 14:02:43
В смысле "на товат" - или опечатка.
wbear
Дата: 31.05.2004 14:02:47
:) те наобород :) залочить все товары сразу одним селектом потом проверить все ли хватает. если нет досвидания. если все хватает начать обрабодку и потом комит
MaxDmt
Дата: 31.05.2004 14:09:32
В том то все и дело что один и тотже товар может выписываться с разных складов. т.е. я получается буду ему мешать своим Lock. А вычисление остатков может происходить длительное время скажем 15 сек на всю накладную *20 пользов- все пьют кофе.
wbear
Дата: 31.05.2004 14:20:35
когда-то давно у меня что-то тоже было с локами я просто делал копию таблицы и с ней уже работал. ну естественно приходилось лочить таблицу перед копированием
MaxDmt
Дата: 31.05.2004 14:48:53
Я тоже посчти так делал, но там было немного пользователей, интересно как рекомендуют в принципе решать такие ситуации, и необязательно в PG.
не въехал
Дата: 31.05.2004 16:09:57
а зачем лочить?
в конце транзакции по товару считай остаток, если отрицательный - откатывай.

нет?
Wireless
Дата: 31.05.2004 16:21:18
deadlock не будет если будешь лочить товары в одном
заранее оговоренном порядке, например 1,2,3,4 или 4,3,2,1 .
MaxDmt
Дата: 31.05.2004 16:50:55
to не въехал
Если у меня списание по FIFO и товара хватает на всех тогда спишет неправильно по партиям

to Wireless: Идея, правда также не идеальна т.к. если пользователей много и БД немаленькая нет гарантий что чейто update не окажется быстрей или медленнее на на разных фазах операции, равноценная скорость может быть только на незагруженном сервере.