InnoDB定义的Mutex的作用
在许多对象(如数据缓冲区、字典表、系统锁表、双写缓冲区等)上、在许多操作作用的对象(如事务、回滚段等)上,InnoDB都定义了很多系统锁,用以保护某个对象。这些系统锁,就是上一节讨论的Mutex。定义好的Mutex的具体作用,详情参见表11-5。
表11-5 InnoDB的系统级锁
类别 |
锁的名称 |
锁及作用 |
数据缓冲区 |
buf_pool |
buf_pool->mutex,保护InnoDB实例的buffer pool |
buf_pool_zip |
buf_pool->zip_mutex,保护InnoDB实例的buffer pool中的压缩页 |
|
buf_block_mutex |
block->mutex,保护buffer控制块 |
|
flush_list |
buf_pool->flush_list_mutex,保护InnoDB实例的buffer pool中刷出list |
|
页面清理 |
page_cleaner |
page_cleaner->mutex,保护清理页面相关的对象page_cleaner_t 和page_cleaner_slot_t |
双写缓冲区 |
buf_dblwr |
buf_dblwr->mutex,保护双写缓冲区 |
数据字典 |
dict_sys |
dict_sys->mutex,保护数据字典表,并使得CREATE TABLE和 DROP TABLE互斥 |
dict_foreign_err |
dict_foreign_err_mutex,保护外键、唯一键错误信息所写的临时文件不被同时操作 |
|
GIS使用的R-tree |
rtr_active_mutex |
index->rtr_track->rtr_active_mutex,保护处于ACTIVE状态的“rtr_info”列表 |
rtr_ssn_mutex |
index->rtr_ssn.mutex,ssn是Split Sequence Number之意,是R-tree索引上因页分裂时而赋予新页的序列号,保护并发下多页分裂时ssn值的原子性 |
|
rtr_match_mutex |
rtr_info->matches->rtr_match_mutex,保护页节点上匹配的记录 |
|
rtr_path_mutex |
rtr_info->rtr_path_mutex,保护R-tree上的“路径”,路径是从根经过内部若干节点到达叶子的一条路 |
|
insert buffer |
ibuf |
ibuf_mutex,保护插入缓存 |
ibuf_bitmap |
ibuf_bitmap_mutex,保护插入缓存的bitmaps |
|
ibuf_pessimistic_insert |
ibuf_pessimistic_insert_mutex,悲观地保护插入缓存的插入操作,悲观的含义是严格限制并发操作即禁止并发的范围较大 |
|
事务相关 |
trx_sys |
trx_sys->mutex,保护全局事务的信息 |
trx |
trx->mutex,保护单个事务的信息 |
|
trx_undo |
trx->undo_mutex,保护单个事务的UNDO信息 |
|
trx_pool |
TrxPoolLock.m_mutex,保护事务池 |
|
trx_pool_manager |
TrxPoolManagerLock.m_mutex,保护事务池管理器 |
|
事务锁 |
lock_sys |
lock_sys->mutex,保护事务锁的锁表 |
lock_sys_wait |
lock_sys->wait_mutex,保护事务锁的锁表内部的部分成员 |
|
Spin Lock,InnoDB称为读写锁 |
rw_lock_list |
rw_lock_list_mutex,保护读写锁对象列表即rw_lock_list,这个对象的锁是通过rw_lock_create宏所表示的rw_lock_create_func()传入的 |
.rw_lock_debug |
rw_lock_debug_mutex |
|
rw_lock_mutex |
rw_lock_get_mutex(lock),保护读写锁自身 |
|
数据统计 |
recalc_pool |
recalc_pool_mutex,保护recalc_pool,recalc_pool是存储后台进程需要做数据统计的表的id集合 |
REDO log buffer |
log_sys |
log_sys->mutex,保护REDO日志的buffer |
log_flush_order |
log_sys->log_flush_order_mutex,保护REDO日志buffer的刷出List有序刷出 |
|
回滚段 |
noredo_rseg/redo_rseg |
rseg->mutex,保护一个回滚段 |
记录索引修改的buf |
index_on |
log->mutex,保护修改索引的buf |
|
row_drop_list |
row_drop_list_mutex,保护DROP TABLE的列表 |
INFORMATION SCHEMA的内部结构 |
cache_last_read |
cache->last_read_mutex |
系统恢复 |
recv_sys |
recv_sys->mutex,保护恢复系统做Apply操作的recv_sys_t的内存结构 |
recv_writer |
recv_sys->writer_mutex,在recv_writer_thread和the recovery thread之间协调刷出动作 |
|
队列 |
work_queue |
wq->mutex,FIFO SPMC work queue,single producer, multiple consumers |
反转索引,即FTS |
fts_delete |
cache->deleted_lock |
fts_optimize |
cache->optimize_lock |
|
fts_doc_id |
cache->doc_id_lock |
|
fts_bg_threads |
bg_threads_mutex,保护bg_threads和fts_add_wq |
|
fts_pll_tokenize |
psort_info[j].mutex,并行排序 |
|
表空间 |
fil_system |
fil_system->mutex,保护表空间的cache |
PURGE操作 |
purge_sys_pq |
purge_sys->pq_mutex,保护PURGE操作的控制块 |
自增对象 |
autoinc |
table->autoinc_mutex,保护表对象上的自增列 |
文件格式 |
file_format_max |
file_format_max.mutex,文件格式内存对象的保护 |
压缩页上的统计信息 |
page_zip_stat_per_index |
page_zip_stat_per_index_mutex,保护 |
页压缩 |
zip_pad_mutex |
index->zip_pad.mutex,保护zip_pad_info_t结构体,zip_pad_info_t是在未被压缩的页面上面留有多少空间给压缩使用 |
系统监控 |
srv_innodb_monitor |
srv_innodb_monitor_mutex,保护系统监控信息,如异步IO信息、日志刷出状态信息等 |
DB Server |
srv_sys |
srv_sys->mutex,保护srv_sys_t结构体,srv_sys_t存放后台线程的相关信息,表明线程的是否ACTIVE的状态等 |
srv_sys_tasks |
srv_sys->tasks_mutex,保护srv_sys_t结构体的任务队列 |
|
srv_monitor_file |
srv_monitor_file_mutex,保护临时的监控文件 |
|
srv_dict_tmpfile |
srv_dict_tmpfile_mutex,保护临时的数据字典输出文件 |
|
srv_misc_tmpfile |
srv_misc_tmpfile_mutex,保护临时的混合诊断输出文件 |
|
OS |
thread_mutex |
thread_mutex,保护线程对象(主要是os_thread_count,活动状态的线程计数器) |
事件 |
event_mutex |
os_event .mutex,保护InnoDB的condition |
文件与IO |
os_file_seek_mutex |
os_file_seek_mutexes[i],保护对OS一层的文件的seek操作 |
os_aio_mutex |
array->mutex,保护异步IO的操作,操作有针对Insert Buffer、REDO Log、Read array、Write array等 |