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

 

posted @ 2020-02-25 20:43  Panky_Wise  阅读(97)  评论(0)    收藏  举报