关于session存储mysql死锁问题

天远科技  发表于:2016-05-17  分类:PHP相关  阅读(3700)  赞同21

做分布式部署,势必然要将session共享,选择用数据库是其中的一种方案,天远科技在开发框架中session的时候发现当mysql数据引擎使用INNODB,应用使用多个接口并发,并且大家都要去更新/删除session,的时候会出现死锁,死锁的产生其实很简单,无非是有进程要更新的记录被另外一个进程占用着。

下面看下mysql的锁机制。

1、MySQL常用存储引擎的锁机制:


MyISAM和MEMORY采用表级锁(table-level locking)

BDB采用页面锁(page-level locking)或表级锁,默认为页面锁

InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁


2、各种锁特点:

表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低

行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高

页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般


3、各种锁的适用场景:

表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用

行级锁则更适合于有大量按索引条件并发更新数据,同时又有并发查询的应用,如一些在线事务处理系统


4、死锁:

是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。

表级锁不会产生死锁.所以解决死锁主要还是针对于最常用的InnoDB.


5、死锁举例分析:

MySQL中,行级锁并不是直接锁记录,而是锁索引。索引分为主键索引和非主键索引两种,如果一条sql语句操作了主键索引,MySQL就会锁定这条主键索引;如果一条语句操作了非主键索引,MySQL会先锁定该非主键索引,再锁定相关的主键索引。

在UPDATE、DELETE操作时,MySQL不仅锁定WHERE条件扫描过的所有索引记录,而且会锁定相邻的键值,即所谓的next-key locking


那么解决方案就是加事务,当执行出现问题的时候回滚记录

博文分类

线

在线联系
点击这里给我发消息
点击这里给我发消息
关注我们