• Marko Mäkelä's avatar
    MDEV-26554: Races between INSERT on child and DDL on parent table · c3c53926
    Marko Mäkelä authored
    The SQL layer never acquires metadata locks (MDL) on the tables
    that the tables that DML statement accesses is modifying.
    
    However, the storage engine must access the parent table in order to
    ensure that the child table will not refer to a non-existing record
    in the parent table.
    
    During certain DDL operations, the InnoDB table metadata (dict_table_t)
    may be be freed and rebuilt. This would cause a race condition with
    a concurrent INSERT that is attempting to report a FOREIGN KEY violation.
    
    We work around the insufficient MDL during DML by acquiring exclusive
    InnoDB table locks on all child tables during DDL. To avoid deadlocks,
    we will follow the following order of acquisition:
    
    1. tables whose REFERENCES clauses point to the current table
    2. the current table that is being subjected to DDL
    3. mysql.innodb_table_stats
    4. mysql.innodb_index_stats
    5. the InnoDB dictionary tables (SYS_TABLES and so on)
    6. exclusive dict_sys.latch
    c3c53926
foreign_key.test 28 KB