最近的项目,每一个事务的的动作太多,然后测试发现有功能导致mysql死锁了
不过很奇怪的是,死锁的语句是一条单纯的非事务update语句,这个我就有点想不通了,如果说是另一个事务锁住了当前行,那么这条update就一句话肯定是无法阻挡事务的继续执行,那么事务执行完毕之后,次update便可以顺利执行了,现在的现象是,用show processlist查看整个数据库就只有这条update处理update状态,没有任何其他语句阻塞,直到达到超时时间50秒,才释放.
这还请高手指点原因.
另外,如果事务锁表较多,是否应该尽量使用同一顺序?如果表有差异,却有局部相同的表,怎么处理比较好呢?
对了,补充一下:
我在本地测试的时候,同样跟服务器是64位mysql,但是jdk是32位的,服务器jdk是64位的,在本地大量数据测试完全没有问题的,一上服务器,只要数据超过2条,就必出问题...

解决方案 »

  1.   

    也要查查是否还有 Select 做了行锁或表锁的,不能只看Update。另外如果是一个事务中有多个操作语句,那么相互作用关系会更复杂。
    另外:有没有检查过本地数据库表的类型 和 服务器端表的类型 是否一致?
      

  2.   


    表类型是一致的
    select进行锁是什么前提呢?
      

  3.   

    不好意思,带大家走进了误区,刚看了,其实不是死锁了,那句update是updating状态的,刚查到是:正在搜索匹配的记录,并且修改它们. 这个意思,但是这个过程很长,一直持续到这条语句失败.长达十多秒
      

  4.   


    看事务隔离级别,比较简单的做法是:Select .... For Update估计是Update所使用的检索没有索引吧?导致全表扫描速度很慢。
      

  5.   


    不对的,这条语句也有正常的情况,正常的时候都是秒杀的
    现在不太清楚为什么会出现updating状态
      

  6.   


    听起来更像是需要Update的行集被锁住了,所以等待释放锁。
      

  7.   

    你们用的是 MyISAM 还是 InnoDB 引擎?