• Dmitry Lenev's avatar
    Fix for bug#14188793 - "DEADLOCK CAUSED BY ALTER TABLE DOEN'T CLEAR · fc2c6692
    Dmitry Lenev authored
    STATUS OF ROLLBACKED TRANSACTION" and bug #17054007 - "TRANSACTION
    IS NOT FULLY ROLLED BACK IN CASE OF INNODB DEADLOCK".
    
    The problem in the first bug report was that although deadlock involving
    metadata locks was reported using the same error code and message as InnoDB
    deadlock it didn't rollback transaction like the latter. This caused
    confusion to users as in some cases after ER_LOCK_DEADLOCK transaction
    could have been restarted immediately and in some cases rollback was
    required.
    
    The problem in the second bug report was that although InnoDB deadlock
    caused transaction rollback in all storage engines it didn't cause release
    of metadata locks. So concurrent DDL on the tables used in transaction was
    blocked until implicit or explicit COMMIT or ROLLBACK was issued in the
    connection which got InnoDB deadlock.
    
    The former issue has stemmed from the fact that when support for detection
    and reporting metadata locks deadlocks was added we erroneously assumed
    that InnoDB doesn't rollback transaction on deadlock but only last statement
    (while this is what happens on InnoDB lock timeout actually) and so didn't
    implement rollback of transactions on MDL deadlocks.
    
    The latter issue was caused by the fact that rollback of transaction due
    to deadlock is carried out by setting THD::transaction_rollback_request
    flag at the point where deadlock is detected and performing rollback
    inside of trans_rollback_stmt() call when this flag is set. And
    trans_rollback_stmt() is not aware of MDL locks, so no MDL locks are
    released.
    
    This patch solves these two problems in the following way:
    
    - In case when MDL deadlock is detect transaction rollback is requested
      by setting THD::transaction_rollback_request flag.
    
    - Code performing rollback of transaction if THD::transaction_rollback_request
      is moved out from trans_rollback_stmt(). Now we handle rollback request
      on the same level as we call trans_rollback_stmt() and release statement/
      transaction MDL locks.
    fc2c6692
sql_admin.cc 37.6 KB