有人能给我解释一下在MySQL 5.1上发现的死锁和锁等待错误的区别吗?它是一样的吗?死锁错误是什么时候发生的?锁等待超时是什么时候发生的?
发布于 2013-05-15 20:00:38
每当事务必须获取才能继续的锁之间出现循环依赖关系时,就会发生deadlock:例如,假设事务1持有锁A,但需要获取锁B才能继续;事务2持有锁B,但需要获取锁A才能继续-事务立即死锁(不需要超时),在释放锁之前两者都无法继续。因此,数据库选择要中止/回滚的事务;应用程序代码应该检测到这种可能性并进行相应的处理,通常是通过再次尝试该事务。死锁类似于警察通过命令随机参与者倒车来解决gridlock (没有车辆能够向前移动的十字路口的情况)。
在事务等待锁的过程中,当配置的超时时间(例如,在InnoDB锁的情况下为innodb_lock_wait_timeout )过去时,就会发生InnoDB等待超时,这可能是因为一个缓慢的事务持有该锁并且尚未完成执行,也可能是因为许多事务正在排队等待该锁。如果事务等待的时间更长,那么锁有可能(甚至很有可能)变得可用并已被获取,但存在超时是为了避免应用程序无限期地等待数据库。等待超时类似于司机因为延误而放弃并返回。
发布于 2013-05-16 12:56:13
Deadlock是两个线程无限地等待同一件事。锁等待超时意味着一个线程在等待获取锁时超时,从而防止死锁。
https://stackoverflow.com/questions/16563843
复制相似问题