MySQL事务陷阱

时间:2011-11-16 09:16:30

标签: mysql transactions

我想在一个项目中使用MySQL事务,但之前没有使用它们,我想我已经读过任何潜在的问题。我在http://mysqldatabaseadministration.blogspot.com/2007/04/innodb-performance-optimization.html发现了一篇文章,该文章表明死锁是常见的,您的应用程序应该能够处理它们。

在这种情况下,'死锁'是指什么?据我了解,事务不会锁定数据库,因此无法锁定。我将如何处理这样的问题。

我还应该注意其他问题吗?

2 个答案:

答案 0 :(得分:3)

当事务1获取(用于写入)资源A时会发生死锁,同时事务2获取资源B.

现在假设事务2想要资源A,但是很忙,所以必须等待,并且事务尝试获取资源B,并且发现它也很忙。你有一个循环的等待,一个僵局。事务1正在等待事务2保持的资源,并且事务2正在等待事务1的资源。两个事务都不能继续。这是最简单的例子,链可以更长。

MySQL的InnoDB检测到死锁并杀死其中一个事务,使其失败。

您可以采取哪些措施来避免此问题:

  • 只需重试该事务,例如您可以重试3次(在高并发环境中测试,就像魅力一样)
  • 以相同的顺序获取资源。如果事务1和2需要第一个资源A,然后是B,则按相同的顺序,问题不会发生

答案 1 :(得分:1)

事务确实会锁定数据库。如果两个交易相互等待,你就会陷入僵局。

交易1:

lock table1;
lock table2;

交易2:

 lock table2;
 lock table1;

如果现在两个交易都已完成第一步,则他们会互相等待。你必须避免这样的序列。