• Dmitry Lenev's avatar
    Fix for bug #50913 "Deadlock between open_and_lock_tables_derived · c7e7a7d2
    Dmitry Lenev authored
    and MDL".
    
    Concurrent execution of a multi-DELETE statement and ALTER
    TABLE statement which affected one of the tables used in
    the multi-DELETE sometimes led to deadlock.
    Similar deadlocks might have occured when one performed
    INSERT/UPDATE/DELETE on a view and concurrently executed
    ALTER TABLE for the view's underlying table, or when one
    concurrently executed TRUNCATE TABLE for InnoDB table and
    ALTER TABLE for the same table.
    
    These deadlocks were caused by a discrepancy between types of
    metadata and thr_lock.cc locks acquired by those statements.
    
    What happened was that multi-DELETE/TRUNCATE/DML-through-the-
    view statement in the first connection acquired SR lock on a
    table, then ALTER TABLE would come in in the second connection
    and acquire SNW metadata lock and TL_WRITE_ALLOW_READ
    thr_lock.c lock and then would start waiting for the first
    connection during lock upgrade. After that the statement in
    the first connection would try to acquire TL_WRITE lock on
    table and would start waiting for the second connection,
    creating a deadlock.
    
    This patch solves this problem by ensuring that we acquire
    SW metadata lock in all cases in which we acquiring write
    thr_lock.c lock. This guarantees that deadlocks like the
    one described above won't occur since all lock conflicts
    in such situation are resolved within MDL subsystem.
    
    This patch also adds assert which should guarantee that
    such situations won't arise in future.
    c7e7a7d2
sql_update.cc 66 KB