|
Транзакции и Локи проблема с использованием
|
|||
---|---|---|---|
#18+
Скажем 20 пользователей выписывают расходные накладные, причем иногда один и тот же товар с одного склада. т.е. для отчетов таблица не блокируется, а для запросов с целью списания блокируется, чтобы не списать больше чем есть. Но проблема в том. что не круто блокировать всю таблицу, нужно только конкретные записи(остатки и обороты которые используются для вычисления остатков). Так как все это делается параллельно, ( если я не ошибаюсь For update также делается параллельно) может возникнуть ситуация deadlock. 1 пользов- блокирует товар 1 и на очереди товар 2, а 2 пользов- уже заблокировал товар 2, 3,4 и на очереди товар 1. Можно конечно создать служебную табл, с одним индексным полем (товар+склад), и перед списанием проверять ее на наличие блокировок товар+склад. Ее для этой операции блокировать полностью, Но наверное также не круто, потомучто одна на всех, блокируется да еще и в режиме update/insert. А если пользователей больше? Такую таблицу таблицу создать также проблема т.к. Lock снимается только после Commit. Если на вопрос так просто не ответить бросьте в меня ссылкой где это описано. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2004, 13:30 |
|
Транзакции и Локи проблема с использованием
|
|||
---|---|---|---|
#18+
а по транзакции на товат никак нельзя? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2004, 13:56 |
|
Транзакции и Локи проблема с использованием
|
|||
---|---|---|---|
#18+
В смысле "на товат" - или опечатка. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2004, 14:02 |
|
Транзакции и Локи проблема с использованием
|
|||
---|---|---|---|
#18+
:) те наобород :) залочить все товары сразу одним селектом потом проверить все ли хватает. если нет досвидания. если все хватает начать обрабодку и потом комит ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2004, 14:02 |
|
Транзакции и Локи проблема с использованием
|
|||
---|---|---|---|
#18+
В том то все и дело что один и тотже товар может выписываться с разных складов. т.е. я получается буду ему мешать своим Lock. А вычисление остатков может происходить длительное время скажем 15 сек на всю накладную *20 пользов- все пьют кофе. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2004, 14:09 |
|
Транзакции и Локи проблема с использованием
|
|||
---|---|---|---|
#18+
когда-то давно у меня что-то тоже было с локами я просто делал копию таблицы и с ней уже работал. ну естественно приходилось лочить таблицу перед копированием ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2004, 14:20 |
|
Транзакции и Локи проблема с использованием
|
|||
---|---|---|---|
#18+
Я тоже посчти так делал, но там было немного пользователей, интересно как рекомендуют в принципе решать такие ситуации, и необязательно в PG. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2004, 14:48 |
|
Транзакции и Локи проблема с использованием
|
|||
---|---|---|---|
#18+
а зачем лочить? в конце транзакции по товару считай остаток, если отрицательный - откатывай. нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2004, 16:09 |
|
Транзакции и Локи проблема с использованием
|
|||
---|---|---|---|
#18+
deadlock не будет если будешь лочить товары в одном заранее оговоренном порядке, например 1,2,3,4 или 4,3,2,1 . ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2004, 16:21 |
|
Транзакции и Локи проблема с использованием
|
|||
---|---|---|---|
#18+
to не въехал Если у меня списание по FIFO и товара хватает на всех тогда спишет неправильно по партиям to Wireless: Идея, правда также не идеальна т.к. если пользователей много и БД немаленькая нет гарантий что чейто update не окажется быстрей или медленнее на на разных фазах операции, равноценная скорость может быть только на незагруженном сервере. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2004, 16:50 |
|
Транзакции и Локи проблема с использованием
|
|||
---|---|---|---|
#18+
авторЕсли у меня списание по FIFO тогда у тебя таблица не товаров, а партий. May be сделать транзакцию по партии (а не товару) и с тем же успехом откатывать (партию)? то же можно и для блокировок (блокируешь по партиям, а не по товарам). Но вообще-то отгрузку (списание массы в ценах реализации) надо бы отделить от списания товара (учетные цены, в т.ч. партионный расчет остатков/цен) (и его методов) - хотя бы если порядок ввода данных не совпадает с датировкой набиваемых документов (что иногда еще случается :-). Достигается это некой денормализацией (есть таблица остатков по товарам - с ней работает отгрузка, а есть - остатки по партиям - с ней - списание. (списание - приведение (посредством некой ХП) таблиц в соответствие на момент времени заданный учетчиком). Тогда отгрузка будет менее напрягать операторов бьющих документы. Списание - более централизованная операция, хоть и лочит "остатки по партиям" (пишет в них), но не лочит остатки по товарам (там она только читает) - т.е. не держит операторов. имхо. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2004, 17:36 |
|
Транзакции и Локи проблема с использованием
|
|||
---|---|---|---|
#18+
блокируешь по партиям, а не по товарам- не понял каким образом т.е. метод и и какая таблица. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2004, 18:17 |
|
Транзакции и Локи проблема с использованием
|
|||
---|---|---|---|
#18+
автор Если у меня списание по FIFO автортогда у тебя таблица не товаров, а партий. что не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2004, 18:23 |
|
Транзакции и Локи проблема с использованием
|
|||
---|---|---|---|
#18+
to Wireless: Идея, правда также не идеальна т.к. если пользователей много и БД немаленькая нет гарантий что чейто update не окажется быстрей или медленнее на на разных фазах операции, равноценная скорость может быть только на незагруженном сервере. Мы говорим именно про deadlock или ты просто хочешь сократить взаимные ожидания? Если речь идет о deadlock, то о чем я говорил - гарантия того что их не будет: Когда все транзакции будут лочить таблицы в одном порядке, то этого не произойдет. Можешь даже функцию какую-нибудь написать: Код: plaintext 1. 2. 3. 4. 5.
:) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2004, 11:32 |
|
Транзакции и Локи проблема с использованием
|
|||
---|---|---|---|
#18+
to Wireless Я хочу сократить взаимные ожидания и не хочу deadlock :) Если залочить таблицу - то ее уже невозможно отпустить до конца транзакции(если я правильно перевожу help). deadlock не будет если будешь лочить товары в одном заранее оговоренном порядке, например 1,2,3,4 или 4,3,2,1 . Здесь убедил! ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2004, 15:06 |
|
Транзакции и Локи проблема с использованием
|
|||
---|---|---|---|
#18+
Я такие записи блокирую на уровне бизнес-логики. Т.е. пока стоит id пользователя в поле locked (таблица, как ты понимаешь, может быть любая), ничего с этой записью, кроме селекта, сделать нельзя. У меня все это на вебе, и один и тот же контракт с поставками могут редактировать несколько человек. Так же могут быть остатки по "заявкам на контракт". ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2004, 02:34 |
|
Транзакции и Локи проблема с использованием
|
|||
---|---|---|---|
#18+
to CM Hungry Хотелось бы подробнее, т.к. у меня поверхностные знания PostgreSQL. Т.е. пока стоит id пользователя в поле locked Что значит id пользователя и поле locked? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2004, 10:50 |
|
Транзакции и Локи проблема с использованием
|
|||
---|---|---|---|
#18+
> Т.е. пока стоит id пользователя в поле locked ситуация. пользователь зашел, к примеру, в режим редактирования товара, твоя бизнес-логика добавила ид юзера в таблицу, описывающую все локи и .... пользователь закрыл браузер. Кто когда и как снимет такой лок? Я рекомендую пользоваться все-таки средствами БД, но разрабатывать ПО таким образом, чтобы локи возникали только на момент изменяющих транзакций, а не на момент пока юзер редактирует у себя чего-то там, что здесь предлагается сделать. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2004, 15:05 |
|
Транзакции и Локи проблема с использованием
|
|||
---|---|---|---|
#18+
2 wireless: лок снимает скрипт по таймауту кроме того, есть возможность определить, работает конкретный пользователь сейчас или нет далее - по закрытию браузера можно выполнить скрипт (onunload), благо интранет ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2004, 16:57 |
|
|
start [/forum/topic.php?fid=53&msg=32541582&tid=2007836]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
49ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 312ms |
total: | 457ms |
0 / 0 |