我想在一个项目中使用MySQL事务,但之前没有使用它们,我想我已经读过任何潜在的问题。我在http://mysqldatabaseadministration.blogspot.com/2007/04/innodb-performance-optimization.html发现了一篇文章,该文章表明死锁是常见的,您的应用程序应该能够处理它们。
在这种情况下,'死锁'是指什么?据我了解,事务不会锁定数据库,因此无法锁定。我将如何处理这样的问题。
我还应该注意其他问题吗?
答案 0 :(得分:3)
当事务1获取(用于写入)资源A时会发生死锁,同时事务2获取资源B.
现在假设事务2想要资源A,但是很忙,所以必须等待,并且事务尝试获取资源B,并且发现它也很忙。你有一个循环的等待,一个僵局。事务1正在等待事务2保持的资源,并且事务2正在等待事务1的资源。两个事务都不能继续。这是最简单的例子,链可以更长。
MySQL的InnoDB检测到死锁并杀死其中一个事务,使其失败。
您可以采取哪些措施来避免此问题:
答案 1 :(得分:1)
事务确实会锁定数据库。如果两个交易相互等待,你就会陷入僵局。
交易1:
lock table1;
lock table2;
交易2:
lock table2;
lock table1;
如果现在两个交易都已完成第一步,则他们会互相等待。你必须避免这样的序列。