问题描述如下:
2台web机器(java) ,一台数据库服务器(mysql),
现在2台机器同时往数据库服务器同1表插入或者修改数据, 导致死锁2台web机器,分别是web1 web2
web1是update a  where a='N' and id in (1,2,3,4,54,45,4,5,45,4,5,4,5,4,5,4,5,.......)
web2是insert into 。。
是同一时刻,结果导致发生死锁。问该如何解决或者避免这个现象??

解决方案 »

  1. 你的表用的什么存储引擎   MyISAM?
      

  2. 如果是MyISAM你只能修改存储引擎    MyISAM不支持行级锁      请使用其他存储引擎例如INNODB
      

  3. 1、Insert 和 Update 之间应该没有锁关联吧,不太明白你是怎么导致的。
    2、请描叙得更加细致一些,你如何找出这两个SQL 之间出现互锁呢?
      

  4. 在某个时间点
    web1是update a  where a='N' and id in (1,2,3,4,54,45,4,5,45,4,5,4,5,4,5,4,5,.......)过1秒进行下面
    web2是insert into 。。 
    (前面的没有做完 , 这样造成行级锁)
      

  5. 你讲的这个情况,MySQL 会自动将第二条SQL 进行等待第一条SQL处理完再运行。
    理论上不会出现互锁问题。
      

  6. 同意楼上
    现在估计是下面原因造成
    server启动的时候“he unused history data will be delete. And at the same time, the updated data will insert into history table, so there will be conflict. ”
    当针对这个表删除部分数据的时候, 同时被更新的数据再次插入数据库这个表??? (这个可能性大吗?)
      

  7. 这个已经测试了--- 你讲的这个情况,MySQL 会自动将第二条SQL 进行等待第一条SQL处理完再运行。 理论上不会出现互锁问题。
      

  8. update的时候一定要加上主键,否则行级锁会锁间隙,然后insert的时候,可能会锁相同的间隙,造成死锁
      

  9. 从你提供错误来看,你这个表会是否有Delete 操作?
      

类似问题 »