锁机制根据不同的存储引擎表现不一样,下面分析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,使该连接发出的更新请求优先级降低。
(3)通过指定INSERT、UPDATE、DELETE语句的LOW_PRIORITY属性,降低该语句的优先级。
(4)给系统参数max_write_lock_count设置一个合适的值,当一个表的读锁达到这个值后,MySQL就暂时将写请求的优先级降低,给读进程一定获得锁的机会。
二,InnoDB
1,该引擎采用行级锁与表级锁。
行锁:共享锁(S)与排他锁(X)。
表锁:意向排他锁与意向共享锁。
表锁是由mysql自动添加的。select添加共享锁,update、insert、delete添加排他锁。
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 ) 不可能 不可能 不可能
===========================================================================================