近两天网站经常出现死锁的情况,程序执行非常简单的insert或update语句,使用了spring自带的事务,没有关联其它表。
用show processlist;查看
显示的状态有的是Update有的是Updating,把这个连接全部kill掉也不能恢复正常,一定要重启mysql,不知道有没有前辈遇到过这种情况?

解决方案 »

  1.   

    详细说明,表什么引擎、执行什么SQL语句、打开事务没有
      

  2.   

    是不是update的where条件没有索引,如果没有索引  不仅更新慢  并且是表锁另外即使是两个select也可能出现死锁
      

  3.   

    看看语句是什么? 可以在慢查询日志中检查一下。insert 如果是简单语句,应该不会锁表,但update 会锁表的。
      

  4.   

    数据库表中的引擎是什么样的。如果是update一定会锁表的。
      

  5.   

    myisam肯定是表锁innodb表锁 行锁都有可能
      

  6.   

    innodb引擎,使用了事务insert语句就是非常简单的insert into table(id,b,c) values(1,2,3)
    update语句也是非常简单的update tables set b=2,c=3 where id=1insert和update的表有外键。搞不明白,为什么会锁死表呢。
      

  7.   


    update的where条件只有一个,是主键id
      

  8.   

    对于myisam引擎来说, 只要开启了并发插入的话, insert通常不会锁表的
      

  9.   

    spring 代理事务有个问题,一般情况下如果你的事务利用不到索引是会用表锁的(innodb).表锁因为粒度大造成的死锁几率相对行锁会小很多。你的where如果用到索引,可能会用行锁,
    但是当一个用户对表进行操作,操作之前事务会把表锁住,然后事务没有及时提交(解锁),就对表进行读取,造成了自己(的读取)对自己(提交写等操作的缓冲)进行等待,造成死锁。
    这个问题以前遇到过。
      

  10.   


    因为spring  对数据库操作封装了,不要观察怎么执行,不过你可以测试一下回调Hibernate用原生态的语句执行观察一下。
      

  11.   


    我没用hibernate,因为应用不适合使用hibernate。不过你说的这句话,有可能发生,意思是不是当一个事务在update或insert时如果事务还未提交的情况下另一个事务对表进行select就会造成死锁呢?
      

  12.   


    我的日志文件怎么只有一个localhost.localdomain.err呢,里面看不到什么东西。
      

  13.   


    log_slow_queries把这个选项打开测试一下,不需要时 关闭。
    不过个人还是认为关键不在数据库端,而在你应用端的配置或者操作,不怎么喜欢spring的封装。
      

  14.   


    是不是一定要在程序内操作事务才会使用mysql的事务?如果程序内不操作事务,mysql会不会默认启用事务?
      

  15.   


    我用的spring注解配置的事务啊,readonly的不使用事务啊!!我全部select的也用了事务,用的是SUPPORTS,是不是这个原因会造成死锁的!
      

  16.   

    一般情况是 <tx:method name="*" read-only="false" propagation="NOT_SUPPORTED"/>
    read-only是要设为true,我是在开发过程中所以设为false。--------------------------------------------
    啊,readonly的不使用事务啊!!我全部select的也用了事务,用的是SUPPORTS,是不是这个原因会造成死锁的
    --------------------------------------------
    你这样设置肯定是有问题的。
      

  17.   


    哎,这下学到了一个大东西。。没加入过什么大型项目的开发,对这些都不是很了解。意思是real-only如果为true的话,一般情况下是不用使用事务的,除非特殊情况对吗?