Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多线程事务的MySQL配置_Mysql_Multithreading_Transactions_Deadlock_Isolation Level - Fatal编程技术网

多线程事务的MySQL配置

多线程事务的MySQL配置,mysql,multithreading,transactions,deadlock,isolation-level,Mysql,Multithreading,Transactions,Deadlock,Isolation Level,我有6个脚本/任务。它们中的每一个都启动一个MySQL事务,然后执行其工作,这意味着从MySQL数据库中选择/更新/插入/删除,然后回滚 因此,如果数据库处于给定的状态S,我将启动一个任务,当任务终止时,数据库将返回到状态S 当我按顺序启动脚本时,一切正常: S状态下的DB 任务1 S状态下的DB 任务2 S状态下的DB 任务6 S状态下的DB 但是我想通过多线程和并行启动脚本来加速这个过程 S状态下的DB 同时完成6项任务 S状态下的DB 有些任务随机失败,我有时会出现以下错误:

我有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:数据库是在我后来更改的可重复读取隔离级别下构建和使用的。

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


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

有些代码会走很长的路。听起来你好像遇到了与变量同步的问题。这可能是因为事务处于回滚状态等。很抱歉澄清我之前的评论,听起来你好像在变量/数据库状态处于未提交/回滚状态方面遇到了问题。好吧,在阅读了一些关于这似乎不是正确的方法。我需要每个线程完全隔离的数据,因此我的见解是使用6个镜像数据库。看起来您在查询的执行时间方面遇到了问题。为什么不看看查询是否可以优化。您确定它们运行得有效吗?同时有6个不同的erent数据库可以工作还有6个数据库需要处理。您是否对正在使用的所有查询运行了“全部解释”功能?您确定不能让它们运行得更快吗?