是这样的,我在程序里关闭了自动提交,然后当两个update语句完成之后,还没有commit
这个时候我拔了我的网线,然后让程序继续运行,然后出错后发现mysql的那句update一直处于等待执行的状态我想问的是,像这种情况,除了手动杀掉被锁的语句,还有没有其他办法?
这种程序应该是处理不了的吧?那么有没有什么设置可以让mysql过一段时间,比如10秒自动把锁释放呢?

解决方案 »

  1.   

    show processlist查看一下。
    结束此进程。
      

  2.   

    如果没有commit 拔掉网线 应该会回滚的吧
      

  3.   

    1:没有commit,那么这个操作是没有被提交的,链接断开后回自动回滚。
    2:然后当两个update语句完成之后,还没有commit  。。 现mysql的那句update一直处于等待执行的状态
    既然都完成了,为何还有处于等待状态?
      

  4.   

    没有COMMIT而拔掉网线, 有的客户端系统会检测到链路层的断线, 会自动关闭这个TCP连接(即有向服务器发送CLOSE请求),此时数据库服务器就会把中断这个transaction,并rollback, 然而很多客户端(可能和操作系统\驱动程序有关)并不会检测到这个断线. 于是服务器还傻傻在等客户端的请求, 这个transaction是不会终止的
      

  5.   

    所以,对于C/S构架来说
    1, 尽量让一个transaction足够短, 避免在一个transaction中间有交互动作
    2, 程序里要有kill process的模块, 让客户自己解决这问题
    3, MYSQL/INNODB里有lock-xxx--timeout参数, 可以设置锁表最多分钟, 超过这个值, 会自动rollback.