2011-11-16 95 views
3

我想在一个项目中使用MySQL事务,但之前没有使用它们,我想我会读到任何潜在的问题。我在http://mysqldatabaseadministration.blogspot.com/2007/04/innodb-performance-optimization.html找到一篇文章,提示死锁很常见,您的应用程序应该能够处理它们。MySQL事务陷阱

在这种情况下,“死锁”是指什么?据我所知,交易不会锁定数据库,因此它不能锁定。我将如何去处理这样的问题。

我还有其他问题需要注意吗?

回答

1

事务确实锁定了数据库。如果两个交易正在等待对方,你就会陷入僵局。

交易1:

lock table1; 
lock table2; 

事务2:

lock table2; 
lock table1; 

如果现在交易双方做了他们的第一个步骤,他们互相等待。你必须避免这样的序列。

3

当事务1(写入)资源A和在此期间交易2获取资源B.死锁可能发生

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

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

,你能做些什么来避免此问题是:

  • 简单地重试事务,例如,你可以重试3次(在高并发环境下进行试验,就像一个魅力)
  • 获得资源以相同的顺序。如果事务1和2需要第一个资源A,然后B需要相同的顺序,则问题不会发生
+0

谢谢。你怎么知道交易已经回滚?目前,我检查交易中的每个查询是否成功,以便知道是否提交。如果出现回滚,至少其中一个会失败,这似乎是合理的,或者是否有标准的检查方式?在Java中 – wyatt

+0

有一个特定的异常,我可以查询,你的编程语言是什么?我认为你所说的话应该是一个合理的检查方式。 – stivlo