用于多线程事务的MySQL配置

时间:2012-04-12 12:20:02

标签: mysql multithreading transactions deadlock isolation-level

我有6个脚本/任务。他们每个人都启动一个MySQL事务,然后完成它的工作,这意味着从MySQL数据库中选择SELECT / UPDATE / INSERT / DELETE,然后回滚。

因此,如果数据库处于给定状态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隔离级别下构建和使用的,之后我改变了。

1 个答案:

答案 0 :(得分:0)

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

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