update跟select的表锁问题 (mysql myisam)
请问,某个页面被访问时,它需要先从表B里找出随机词的ID(字段:now_id),然后再去表A里查找这个随机词。
当从表B里select出这个随机词的ID(now_id)后,会now_id+1。
但现在的问题是,可能是因为瞬间的访问量很大,导致表B里update根本没完成就又select了。。。我很纳闷,,既然有update,不是应该update完之后才会select吗,,update会自动加写锁,然后应该等update执行完才可以执行select。
我现在想要让它update完再select,又不至于造成阻塞。。
当从表B里select出这个随机词的ID(now_id)后,会now_id+1。
但现在的问题是,可能是因为瞬间的访问量很大,导致表B里update根本没完成就又select了。。。我很纳闷,,既然有update,不是应该update完之后才会select吗,,update会自动加写锁,然后应该等update执行完才可以执行select。
我现在想要让它update完再select,又不至于造成阻塞。。
$sql = "select * from fan_keyword where id=(select fval from hao_fan_temp where fkey='keyword_produce_id' limit 1)";
$result = mysql_query($sql);
$arr = mysql_fetch_assoc($result);
if(!empty($arr))
{
$keyname = $arr['name'];
$idd = intval($arr['id']) + 1;
}else{
$sql = "select * from fan_keyword limit 1";
$result = mysql_query($sql);
$arr = mysql_fetch_assoc($result);
$keyname = $arr['name'];
$idd = intval($arr['id']) + 1;
}
$sql1 = "update hao_fan_temp set fval='$idd' where fkey='keyword_produce_id'";
mysql_query($sql1) or exit('auto_produce: 保存当前抽取的词ID失败');
...全文
相关推荐
高性能MySQL读书笔记 找出谁持有锁
在第二个终端中,我们尝试更新`foo`表,但这个UPDATE操作被SELECT SLEEP语句阻塞,显示为"Locked"状态。
Mysql(MyISAM)的读写互斥锁问题的解决方法
尤其是在主从复制环境中,主库快速完成写操作,而从库因为持续的SELECT查询而被UPDATE和INSERT操作堵塞,引发从库负载过高。MyISAM的读写锁问题是由于其存储机制决定的。
浅析MYSQL中的并发操作与锁定
MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁。
MySQL:锁机制.pdf
在使用行级锁时,可以创建InnoDB类型的表,然后通过SELECT ... FOR UPDATE对特定行进行加锁。
MySQL锁详细介绍
**表级锁**:锁住整个表,如MyISAM引擎支持表级锁,这可以简化锁管理,但可能导致较大的锁定粒度,降低并发性能。6. **行级锁**:MySQL的InnoDB引擎支持行级锁,提供更高的并发性。


