Обсуждение: DeadLockCheck...

Поиск
Список
Период
Сортировка

DeadLockCheck...

От
Vadim Mikheev
Дата:
session-1:
vac=> begin;
BEGIN
vac=> lock table t in row share mode;
LOCK TABLE

session-2:
vac=> begin;
BEGIN
vac=> lock table t in row share mode;
LOCK TABLE

session-3:
vac=> begin;
BEGIN
vac=> lock table t in row exclusive mode;
LOCK TABLE

session-1:
vac=> lock table t in share row exclusive mode;
--waiting (conflicts with session-3 lock)

session-2:
vac=> lock table t in share row exclusive mode;
NOTICE:  Deadlock detected -- See the lock(l) manual page for a possible cause.
ERROR:  WaitOnLock: error on wakeup - Aborting this transaction

???

ShareLockExclusive mode doesn't conflict with RowShare mode 
(though it is self-conflicting mode).

Comments in DeadLockCheck() say:    /*     * For findlock's wait queue, we are interested in     * procs who are
blockedwaiting for a write-lock on     * the table we are waiting on, and already hold a     * lock on it. We first
checkto see if there is an     * escalation deadlock, where we hold a readlock and     * want a writelock, and someone
elseholds readlock     * on the same table, and wants a writelock.     *     * Basically, the test is, "Do we both hold
somelock on     * findlock, and we are both waiting in the lock     * queue?"   bjm     */
 

Unfortunately, this is not right test any more -:(.

Vadim