innodb锁之间的兼容性判断

检查锁与锁之间的兼容性

路径:/mysql-5.5.43/storage/innobase/lock/lock0lock.c 

实现:见锁的强度比较

 

 row 可理解为 lock 的锁模式

 column 可理解为 预加锁的模式

反过来也行

 

速记:只要包括X字符,跟谁都不兼容

 

/* LOCK COMPATIBILITY MATRIX
 *     IS    IX    S    X     AI
 * IS  +     +     +    -     +
 * IX  +     +     -    -     +
 * S   +     -     +    -     -
 * X   -     -     -    -     -
 * AI  +     +     -    -     -
 *
 * Note that for rows, InnoDB only acquires S or X locks.
 * For tables, InnoDB normally acquires IS or IX locks.
 * S or X table locks are only acquired for LOCK TABLES.
 * Auto-increment (AI) locks are needed because of
 * statement-level MySQL binlog.
 * See also lock_mode_compatible().
 */

/*********************************************************************//**
Calculates if lock mode 1 is compatible with lock mode 2.
@return    nonzero if mode1 compatible with mode2 */
UNIV_INLINE
ulint
lock_mode_compatible(
/*=================*/
    enum lock_mode    mode1,    /*!< in: lock mode */
    enum lock_mode    mode2)    /*!< in: lock mode */
{
    ut_ad(mode1 == LOCK_X || mode1 == LOCK_S || mode1 == LOCK_IX
          || mode1 == LOCK_IS || mode1 == LOCK_AUTO_INC);
    ut_ad(mode2 == LOCK_X || mode2 == LOCK_S || mode2 == LOCK_IX
          || mode2 == LOCK_IS || mode2 == LOCK_AUTO_INC);

    return((LOCK_MODE_COMPATIBILITY) & LK(mode1, mode2));
}

 

posted @ 2015-11-05 11:25  taek  阅读(722)  评论(0编辑  收藏  举报