2

我有 6 个脚本/任务。他们每个人都启动一个 MySQL 事务,然后执行它的工作,这意味着从 MySQL 数据库中选择/更新/插入/删除,然后回滚。

因此,如果数据库处于给定状态 S,我启动一个任务,当任务终止时,数据库又回到状态 S。

当我按顺序启动脚本时,一切正常:

  • 状态 S 的 DB
  • 任务1
  • 状态 S 的 DB
  • 任务 2
  • 状态 S 的 DB
  • ...
  • ...
  • 任务 6
  • 状态 S 的 DB

但我想通过多线程和并行启动脚本来加速这个过程。

  • 状态 S 的 DB
  • 6个任务同时进行
  • 状态 S 的 DB

有些任务随机失败,我有时会收到此错误:

SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction

我不明白,我认为交易是为此而生的。有什么我想念的吗?欢迎任何经验,建议,线索。

MySQL的配置是:

innodb_lock_wait_timeout = 500
transaction-isolation = SERIALIZABLE

我在每个会话开始时添加 AUTOCOMMIT = 0 。

PS:数据库是在我之后更改的 REPEATABLE READ 隔离级别下构建和使用的。

4

1 回答 1

0

您可以通过确保每个事务/进程在所有情况下使用相同的 ORDER BY 以及表本身的相同顺序(至少具有可重复的读取隔离级别)对所有必需的数据/表执行 SELECT...FOR UPDATE 来防止死锁在 MySQL 中)。

除此之外,隔离级别和事务并不意味着处理死锁,反之亦然,它们是死锁存在的原因。如果您遇到死锁,很有可能您的数据集状态会不一致(这可能会更严重 - 如果不是,您可能根本不需要事务)。

于 2012-07-10T12:24:38.760 回答