• Dmitry Lenev's avatar
    Fix for bug #45143 "All connections hang on concurrent ALTER TABLE". · dfa2acb1
    Dmitry Lenev authored
    Concurrent execution of statements which require non-table-level
    write locks on several instances of the same table (such as
    SELECT ... FOR UPDATE which uses same InnoDB table twice or a DML
    statement which invokes trigger which tries to update same InnoDB
    table directly and through stored function) and statements which
    required table-level locks on this table (e.g. LOCK TABLE ... WRITE,
    ALTER TABLE, ...) might have resulted in a deadlock.
    
    The problem occured when a thread tried to acquire write lock
    (TL_WRITE_ALLOW_WRITE) on the table but had to wait since there was
    a pending write lock (TL_WRITE, TL_WRITE_ALLOW_READ) on this table
    and we failed to detect that this thread already had another instance
    of write lock on it (so in fact we were trying to acquire recursive
    lock) because there was also another thread holding write lock on the
    table (also TL_WRITE_ALLOW_WRITE). When the latter thread released
    its lock neither the first thread nor the thread trying to acquire
    TL_WRITE/TL_WRITE_ALLOW_READ were woken up (as table was still write
    locked by the first thread) so we ended up with a deadlock.
    
    This patch solves this problem by ensuring that thread which
    already has write lock on the table won't wait when it tries
    to acquire second write lock on the same table.
    dfa2acb1
thr_lock.c 54.6 KB