(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只有表锁。
分析加锁过程的前提条件,事务隔离级别。
数据库并发产生的问题
===========================================================================================
隔离级别 脏读(Dirty Read) 不可重复读(NonRepeatable Read) 幻读(Phantom Read)
===========================================================================================
未提交读(Read uncommitted) 可能 可能 可能
已提交读(Read committed) 不可能 可能 可能
可重复读(Repeatable read) 不可能 不可能 可能
可串行化(Serializable ) 不可能 不可能 不可能
===========================================================================================