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等 |