>> orders_logs - имеет FOREIGN на users и orders соответственно (uid,
>> oid)
>>
>> Кронскрипт иногда юзерам обновляет статусы
>>
>> UPDATE
>> users
>> SET
>> status = что-то там,
>> time = NOW()
>> WHERE
>> id = что-то там
>>
>> а в orders_logs иногда пишутся события:
>>
>> INSERT INTO
>> "orders_logs"
>>
>> ("uid", "oid", "time", "event")
>> VALUES
>> (123, 2345, NOW(), что-то там)
>>
>> и вот обновление статуса у юзера изредка встает в дедлок с инсертом в
>> orders_logs.
>>
>> как такой дедлок можно вылечить?
> Судя по всему инсерты идут пачками в транзакции, так?
> Можно ли отказаться от транзакции, делая отдельные инсерты?
инсерты идут по одному.
но вот дедлочится тот (первый) инсерт который идет в одной транзакции
с вставкой в ордер.
собственно вставка выглядит так:
BEGIN TRANSACTION;
INSERT INTO orders ... RETURNING "id"
INSERT INTO orders_logs
oid = вставленый_выше id,
uid = определенный вне транзакции uid,
comment = 'Заказ такой-то создан'
COMMIT
таблица orders не имеет ссылок ни на какие другие таблицы.
таблица orders_logs имеет ссылки на users и orders
дедлочится это с запросом (вне транзакции)
UPDATE
users
SET
status = что-то
WHERE
id = тот же юзер что и выше
связь я улавливаю, но природу дедлока понять не могу :)
--
. ''`. Dmitry E. Oboukhov
: :’ : email: unera@debian.org jabber://UNera@uvw.ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537