lock和latch的比较
latch 一般称为闩锁(轻量级的锁) 因为其要求锁定的时间非常短,若迟勋时间长,则应用性能非常差,在InnoDB存储引擎中,latch有可以分为mutex(互斥锁)和rwlock(读写锁)其目的用来保证并发线程操作临界资源的正确性,并且没有死锁检测的机制
lock的对象是事务,用来锁定的是数据库中的UI想,如表、页、行。并且一般lock对象仅在事务commit或rollback后进行释放(不同事务隔离级别释放的时间可能不同),此外lock正如大多数数据库中一样,是有死锁机制的。表显示了lock与latch的不同
mysql> SHOW ENGINE INNODB MUTEX; +--------+-------------------+-------------+ | Type | Name | Status | +--------+-------------------+-------------+ | InnoDB | dict0dict.cc:1057 | os_waits=2 | | InnoDB | log0log.cc:844 | os_waits=1 | | InnoDB | fil0fil.cc:1690 | os_waits=1 | | InnoDB | dict0dict.cc:1066 | os_waits=3 | | InnoDB | log0log.cc:907 | os_waits=11 | +--------+-------------------+-------------+
在DEBUG版本下,通过SHOW ENGINE INNODB MUTEX 可以看到latch的更多信息
debug中status字段中的参数介绍
若将上锁的对象看成一棵树,那么对最上层的对象上锁,也就是对最细粒度的对象进行上锁,那么首先需要对粗粒度的对象上锁,如上图,如果需要对页上的记录r进行上X锁,那么分别需要对数据A、表、页上意向锁IX,最后对记录r上X锁,若其中任何一部分导致等待,那么该操作需要等待粗粒度锁的完成
innodb锁相关的表
INNODB_LOCKS表
a) lock_id:锁的id以及被锁住的空间id编号、页数量、行数量
b) lock_trx_id:锁的事务id。
c) lock_mode:锁的模式。
d) lock_type:锁的类型,表锁还是行锁
e) lock_table:要加锁的表。
f) lock_index:锁的索引。
g) lock_space:innodb存储引擎表空间的id号码
h) lock_page:被锁住的页的数量,如果是表锁,则为null值。
i) lock_rec:被锁住的行的数量,如果表锁,则为null值。
j) lock_data:被锁住的行的主键值,如果表锁,则为null值。
innodb_lock_waits表
1) requesting_trx_id:申请锁资源的事务id。
2) requested_lock_id:申请的锁的id。
3) blocking_trx_id:阻塞的事务id。
4) blocking_lock_id:阻塞的锁的id。
innodb_trx表
trx_id事务ID
trx_state事务状态
trx_started事务开始时间
trx_requested_lock_idinnodb_locks.lock_id
trx_wait_started事务开始等待的时间
trx_weight
trx_mysql_thread_id事务线程ID
trx_query具体SQL语句
trx_operation_state事务当前操作状态
trx_tables_in_use事务中有多少个表被使用
trx_tables_locked事务拥有多少个锁
trx_lock_structs
trx_lock_memory_bytes事务锁住的内存大小(B)
trx_rows_locked事务锁住的行数
trx_rows_modified事务更改的行数
trx_concurrency_tickets事务并发票数
trx_isolation_level事务隔离级别
trx_unique_checks是否唯一性检查
trx_foreign_key_checks是否外键检查
trx_last_foreign_key_error最后的外键错误
trx_adaptive_hash_latched
trx_adaptive_hash_timeout
一致性非锁定读(consistent nonlocking read)是指InnoDB存储引擎通过多版本控制(multi versionning)的方式来读取当前执行时间数据库中行的数据,如果读取的行正在执行DELETE或UPDATE操作,这是读取操作不会因此等待行上锁的释放。相反的,InnoDB会去读取行的一个快照数据
一致性锁定读的SQL语法
-- 排他锁 SELECT ...... FOR UPDATE -- 共享锁 SELECT ...... LOCK IN SHARE MODE
自增锁
-- 内部用下列方式实现的 SELECT max(auto_inc_col) FROM t FOR UPDATE;
MySQL 5.1.22版本开始,InnoDB提供了一种轻量级互斥量的自增长实现机制,这种机制大大提高了自增长插入的性能。
InnoDB提供了一个参数innodb_autoinc_lock_mode来控制自增长的模式,该参数的默认值为1,在继续讨论新的自增长实现方式之前,需要对自增长的插入进行分类