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