accounts SET balance = balance + 100.00 WHERE acctnum = 11111;
Причем много запросов, как в тот же самый acctnum = 11111, так и по другим acctnum
Если смотреть по блокировкам то вижу такое
state | pid | wait_event | wait_event_type
-------+--------+---------------------+-----------------+
active | 59051 | transactionid | Lock
Если избавиться от транзацкий, то какие проблемы я могу словить?
З.Ы. конечно могут быть взаимоблокировки, тут я хз, если подскажите как их отловить то еще лучше
Если вы пишете биллинг, и у вас будет хоть какая-то параллельная работа, а не три клиента в сутки, то настоятельно рекомендую изучить: 1) как работает MVCC в постгресе; 2) как работают блокировки. Не глядя на конкретный код нельзя сказать. какие проблемы будут. Можно только сказать «погода на марсе вместо балансов», что клиенты не очень любят (я проверял на них).
У нас не биллинг, скинул пример из руководства по pg, cпасибо я тут пообщался с разрабом, логика такая: Воркеры асинхронные Делается селект, если такого acc_id нет, то делается INSERT, но если acc_id есть то делает UPDATE поля. В тоже время другой воркер делает то же самое. Отсюда и блокировки
Да, один UPDATE по данной строке заставить другой ждать. Без явной транзакции — тоже.
так пускай воркеры обрабатывают каждый свой набор аккаунтов. то есть вычислять номер воркера по номеру аккаунты детерминистично (к примеру через остаток от деления). тогда и не будет нескольких воркеров работающих с одним и тем же аккаунтом. и приложению лучше и постгрессу )))
ку. подскажите. допустим есть таблица с очень большим числом записей, но надо вернуть последние Н (по времени). данная задача может быть решена за какое-то константное время независимо числа записей в бд? оптимизация запроса, индексы, кеши и прочее позволяют такой результат иметь?
Обсуждают сегодня