• Marko Mäkelä's avatar
    MDEV-25902 Unexpected ER_LOCK_WAIT_TIMEOUT and result · 161e4bfa
    Marko Mäkelä authored
    trans_rollback_to_savepoint(): Only release metadata locks (MDL)
    if the storage engines agree, after the changes were already rolled back.
    
    Ever since commit 3792693f
    and mysql/mysql-server@55ceedbc3feb911505dcba6cee8080d55ce86dda
    we used to cheat here and always release MDL if the binlog is disabled.
    
    MDL are supposed to prevent race conditions between DML and DDL also
    when no replication is in use. MDL are supposed to be a superset of
    InnoDB table locks: InnoDB table lock may only exist if the thread
    also holds MDL on the table name.
    
    In the included test case, ROLLBACK TO SAVEPOINT would wrongly release
    the MDL on both tables and let ALTER TABLE proceed, even though the DML
    transaction is actually holding locks on the table.
    
    Until commit 1bd681c8 (MDEV-25506)
    InnoDB worked around the locking violation in a blatantly non-ACID way:
    If locks exist on a table that is being dropped (in this case, actually
    a partition of a table that is being rebuilt by ALTER TABLE), InnoDB
    would move the table (or partition) into a queue, to be dropped after
    the locks and references had been released.
    
    The scenario of commit 3792693f
    is unaffected by this fix, because mariadb-dump (a.k.a. mysqldump)
    would use non-locking reads, and the transaction would not be holding
    any InnoDB locks during the execution of ROLLBACK TO SAVEPOINT.
    MVCC reads inside InnoDB are only covered by MDL and page latches,
    not by any table or record locks.
    
    FIXME: It would be nice if storage engines were specifically asked
    which MDL can be released, instead of only offering a choice
    between all or nothing. InnoDB should be able to release any
    locks for tables that are no longer in trx_t::mod_tables, except
    if another transaction had converted some implicit record locks
    to explicit ones, before the ROLLBACK TO SAVEPOINT had been completed.
    
    Reviewed by: Sergei Golubchik
    161e4bfa
alter_partitioned.result 1.48 KB