环境linux +mysql +java +tomcat
高并发在线
java 代码里(不是我写的 前面有若干人)
Entity a,User u ").append(" WHERE ")
.append(" a.id=? and u.id=ac.Id");
if (forupdate) {
sbSel.append(" FOR UPDATE
大致意思 是 select a.* from Entity a,User u where a.id=? and u.id=a.Id  for update如果是单一的表对于主键for update如果主键id存在, innodb(本mysql全部是innodb引擎)将产生行级锁,
但目前 这个情况很让人头疼select a.* from Entity a,User u where a.id=? and u.id=a.Id  for update
明知道不好 ,但无法说明白理由?  (开发人员说是为了保证数据的当时一致性,这个是为了计算数值 所以必须数据一致)以前用过乐观锁,但这里2个表join确实没有遇到过,不知道该如何安全妥善处理? 

解决方案 »

  1.   

    select a.* from Entity a,User u where a.id=? and u.id=a.Id for update这2个表是自然连接,没有关联字段,那么用不到任何索引。
    从A里读一条,然后到U里循环每一台,然后再到A读一条,再到U里循环直到全部读完。。这样的语句产生A,U都是表锁定。
      

  2.   

    elect a.* from Entity a,User u where a.id=? and u.id=a.Id for update
    有关联字段 的   u.id=a.Id   
      

  3.   

    这个是锁定对应的行  行级锁 
    mysql死锁是自动清除的 。  他的行级锁可以升级为表级锁