之前明哥提到过Myiam表的读和写是串行的,但是这是就总体而言,在一定条件下MyISAM表也支持查询和插入操作的并发进行.
MyISAM存储引擎有一个系统变量concurrent_insert,专门用于充值其并发插入的行为,其值分别可以为0,1和2
1 当concurrent_insert = 0 时,不允许并发插入
2 当concurrent_insert = 1时,如果myisam表中没有空洞(即表的中间没有被删除的行),myisam允许在一个进程读表的同时,另一个进程从表尾插入记录,这就是mysql的默认设置
3 当concurrent_insert = 2时,无论myisam表中有没有空洞,都允许在表尾并发插入记录
查看concurrent_insert 变量值并将其修改为2
下图所示concurrent_insert=2时,当左侧mysql客户端加上local关键字后,添加删除修改是失败的,但是右侧mysql客户端可以执行添加操作,并且左侧mysql客户端是无法查看到才添加的数据
下图所示concurrent_insert=1时,当左侧mysql客户端加上local关键字后,添加删除修改是失败的,但是右侧mysql客户端不可以执行添加操作,只有解锁右侧客户端才会添加成功
一个进程请求某个myisam表的读锁,同时另一个进程也请求同一表的写锁?mysql如何处理?
写进程先获得锁,即使读请求先到锁等待队列,写请求后到,写锁也会插入到读锁队列。mysql认为写请求比读请求更重要。myisam不太适合于有大量更新操作和查询操作的原因。因此大量的更新操作会造成查询操作很难获得读锁,从而可能永远堵塞
解决方法: set low_priority_updates =1; 使该连接发出的更新请求优先级降低(insert,delete也可以通过这种方法指定)
网友评论