我们使用的是MySQL与InnoDB引擎存储。 我们发送上表中的多个并发请求的“事件触发”的环境。 基本上,它的工作原理是这样的: 我们有一个find_or_insert函数,它是: - 找() - >在结果上,如果为空 - >插入 - >上结果发现()

我们正在使用非阻塞MySQL驱动,所以基本上,当我们开始这个小算法不止一次地在同一时间,其插入第一个结果...等之前运行所有的发现。

不幸的是,我们得到这些错误: “死锁发现试图获取锁时,请尝试重新启动交易”

任何人都可以提供帮助的?

[编辑]:另外,我其实不明白为什么会MySQL的需要锁定表只是在这里插入一个新元素。起初,我虽然自动增加在这里的罪魁祸首,所以我删除它... BU我仍然得到错误。有一种方法,以防止MySQL来锁定插入物的表

有帮助吗?

解决方案

尝试 MySQL参考手册用于诊断和解决。这听起来像您这样的高速缓存。一个可能的原因是,很多客户的同时打表试图创建的第一个版本“(即打“如果插入空”)。也许你可以添加一个伪随机延迟或协调创作者,让你没有得到大量的并发创建呼叫到数据库?

编辑:你见过页面?好像你需要设置my.cnf中设置与InnoDB的禁用每个表的锁。我主要是暗示虽然,您的测试可能无法表示,因为它可能含有更高比例的作家比在现实情况。如果你有一个空表,他们将所有的即时阻断创建(即使是相同的价值也许)启动100个线程。这比在你的钥匙更好的传播,减少失误和比例更高的读取平均情况更糟。如果这是预期的行为(即你有这样的行为,生活),我建议增加在创建报表的退避策略。

其他提示

您需要这些请求发生一次一个,所以也许停止使用非阻塞的驱动程序。或者实现你自己的阻塞机制。等待一个在移动到下一个之前完成。

您还没有说,这是不合理的,或者你因为某些原因需要这些东西沿着这样快速移动。

我改变了我的答案,以反映的问题进行修订。现在听起来这仅仅是与并发插入的问题,而不是在找到的行为的依赖。

这是我的理解是不InnoDB的行锁定在插入和你不能关闭这个功能。然而,你[编辑]无法使用INSERT推迟。我刚刚看了这不适用于InnoDB的。

http://dev.mysql.com/doc /refman/5.0/en/insert-delayed.html

也许周围的一切你写一个明确的LOCK TABLES集体将覆盖默认的锁定行为。如果当写事件发生时有间隔期间在表上没有其他操作,这可能工作。

http://dev.mysql.com/doc /refman/5.0/en/lock-tables.html

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top