06-Mysql锁机制
1.锁机制的作用
1 保证事务之间的隔离性。也保证了数据的一致性。 2 保证资源不会争用。锁是属于资源的,不是某个事务的特性。 3 每次事务需要资源的时候,需要申请持有资源的锁。
2.锁的类型
内存锁 :mutex , latch ,保证内存数据页资源不被争用,不被置换。
对象锁 :
MDL(元数据锁) : 修改元数据时。DDL--> alter ,备份
Table_lock : 表锁,DDL ,备份(FTWRL全局表锁) ,lock tables t1 read,也可以能升级为表锁。
record(row) lock : 行锁,索引锁,锁定聚簇索引。
GAP : 间隙锁,RR级别,普通辅助索引间隙锁。
Next-lock : 下一键锁,GAP+record lock,普通辅助索引的范围锁
对象锁粒度 :
MDL(元数据锁) : 修改元数据时。DDL--> alter ,备份
Table_lock : 表锁,DDL ,备份(FTWRL全局表锁) ,lock tables t1 read,也可以能升级为表锁。
record(row) lock : 行锁,索引锁,锁定聚簇索引。
GAP : 间隙锁,RR级别,普通辅助索引间隙锁。
Next-lock : 下一键锁,GAP+record lock,普通辅助索引的范围锁
功能分类:
IS : 意向共享锁 ,表级别
S :共享锁,读锁,行级别
IX :意向排他锁 ,表级别
X :排他锁,写锁,行级别
3.事务的一致性ACID的C特性
A :原子性 ,UNDO ,REDO
D : 持久性 ,Redo(WAL)
I : 隔离性 ,ISOLATION Level,Lock,MVCC(UNDO)
C:保证工作前,中,后,数据的状态都是完整的,一致的。
所以C的特性是以上所有特性都是来保证一致性的。
写一致性: UNDO,REDO,LOCK
读一致性: ISOLATION Level, MVCC(UNDO)
数据页的一致性:
double write buffer(磁盘区域)
doublewrite buffer是InnoDB在tablespace上的128个页(2个区)大小是2MB。
为了解决 partial page write问题,当MySQL将脏数据flush到data file的时候, 先使用memcopy将脏数据复制到内存中的doublewrite buffer,
之后通过doublewrite buffer再分2次,每次写入1MB到共享表空间,然后马上调用fsync函数,
同步到磁盘上,避免缓冲带来的问题,在这个过程中,doublewrite是顺序写,开销并不大,在完成doublewrite写入后,
再将double write buffer写入各表空间文件,这时是离散写入。
所以在正常的情况下, MySQL写数据page时,会写两遍到磁盘上,第一遍是写到doublewrite buffer,
第二遍是从doublewrite buffer写到真正的数据文件中。如果发生了极端情况(断电),InnoDB再次启动后,
发现了一个page数据已经损坏,那么此时就可以从doublewrite buffer中进行数据恢复了。
4.存储引擎核心参数
1. innodb_flush_log_at_trx_commit=1/0/2
双一标准之一: redo log 刷写参数
2. innodb_flush_method=fsync/O_DIRECT/O_DIRECT/O_SYNC
作用: 控制MySQL刷写磁盘时,是否使用OS Cache
fsync 模式:
buffer pool的数据写磁盘的时候,需要先经历os cache,然后再写到磁盘
redo buffer 的数据写磁盘的时候,需要先经历os cache,然后再写到磁盘
O_DSYNC:
buffer pool的数据写磁盘的时候,需要先经历os cache,然后再写到磁盘
redo buffer 的数据写磁盘的时候,直接写到磁盘,跨过OS Cache
O_DIRECT:
buffer pool的数据写磁盘的时候,直接写到磁盘,跨过 OS Cache
redo buffer 的数据写磁盘的时候,需要先经历os cache,然后再写到磁盘
生产建议使用O_DIRECT,最好是配合固态盘使用。
3.innodb_buffer_pool_size
作用: 数据缓冲区的总大小。缓冲数据页和索引页。是MySQL最大的内存区域。
默认: 128M
官方建议:80-90% 物理内存
生产建议:75%以下,按需调配
SET GLOBAL innodb_buffer_pool_size=402653184;
mysql> show engine innodb status \G

浙公网安备 33010602011771号