Mysql 数据库锁机制浅析

锁机制根据不一样的存储引擎表现不同,下面分析MyISAM存储引擎与InnoDB两种存储引擎。
 
一,MyISAM
1,该引擎采用的是表级锁,有:
读锁:表级读共享锁;
写锁:表级独占锁。
具体表现为:
1.1,当一个session对表加了读锁以后,本session能够对表进行读操做,写操做排队操做。其它session能够进行读操做,写操做排队。
1.2,当一个session对表加了写锁以后,本session能够对表进行读写操做,其它session读写操做排队。
2,锁操做由谁触发。
通常由数据库自动添加锁。
显示添加语法以下:
Lock table 表名 锁类型【读/写】
3,并发插入问题
 
4,锁调度问题
当读进程与写进程争抢同一张表的时候,写进程优先获取写锁。在排队队列中处于队列后面的写进程回先于对列前面的读进程得到锁。
能够看出此引擎不适合大量写操做场景。
经过如下一些设置能够控制MyISAM引擎的调度行为:
(1)经过指定启动参数low-priority-updates,使MyISAM引擎默认给予读请求以优先的权利。

(2)经过执行命令SET LOW_PRIORITY_UPDATES=1,使该链接发出的更新请求优先级下降。mysql

(3)经过指定INSERT、UPDATE、DELETE语句的LOW_PRIORITY属性,下降该语句的优先级。sql

(4)给系统参数max_write_lock_count设置一个合适的值,当一个表的读锁达到这个值后,MySQL就暂时将写请求的优先级下降,给读进程必定得到锁的机会。数据库

二,InnoDBsession

1,该引擎采用行级锁与表级锁。并发

行锁:共享锁(S)与排他锁(X)。spa

表锁:意向排他锁与意向共享锁。code

表锁是由mysql自动添加的。select添加共享锁,update、insert、delete添加排他锁。server

2,行锁实现方式。索引

InnoDB是经过给索引项添加锁来实现行级锁的,这个特色意味着:队列

(1)只有经过索引条件检索数据,InnoDB才使用行级锁,不然,InnoDB 将使用表锁。

(2)因为MySQL的行锁是针对索引加的锁,不是针对记录加的锁,因此虽然是访问不一样行的记录,可是若是是使用相同的索引键,是会出现锁冲突的。

(3)当表有多个索引的时候,不一样的事务可使用不一样的索引锁定不一样的行,另外,不管是使用主键索引、惟一索引或普通索引,InnoDB 都会使用行锁来对数据加锁。(虽然使用的是不一样的索引,可是若是记录已经被其余session锁定的话也是须要等待的。)

(4)即使在条件中使用了索引字段,可是否使用索引来检索数据是由MySQL 经过判断不一样执行计划的代价来决定的,若是MySQL 认为全表扫描效率更高,好比对一些很小的表,它就不会使用索引,这种状况下InnoDB将使用表锁,而不是行锁。

=================================================================

Mysql分为server层与引擎层。

链接创建在server上,后续加锁下沉到不一样的存储引擎实现。

一,分析Innodb加锁过程。Myisam只有表锁。

分析加锁过程的前提条件,事务隔离级别。

二,数据库提供的事务隔离级别
1,read-uncommitted(读未提交)
2,read-committed(读提交)
3,repeatable-read(重复读)
4,serializable(串行)

数据库并发产生的问题

脏读:事务A读取了事务B更新的数据,然而事务B回滚。形成A读取的数据为脏数据;
不可重复读:事务A屡次读取同一数据,事务B在事务A读取的过程当中修改了数据并提交。致使事务A读取的数据不一致;
幻读:事务A更改了表中所有数据,事务B往其中插入了一些数据。致使事务A产生幻觉认为没有修改所有数据行。

===========================================================================================
       隔离级别               脏读(Dirty Read)          不可重复读(NonRepeatable Read)     幻读(Phantom Read) 
===========================================================================================

未提交读(Read uncommitted)        可能                            可能                       可能

已提交读(Read committed)          不可能                          可能                        可能

可重复读(Repeatable read)          不可能                          不可能                     可能

可串行化(Serializable )                不可能                          不可能                     不可能

===========================================================================================

相关文章
相关标签/搜索