多线程事务的MySQL配置
我有6个脚本/任务。它们中的每一个都启动一个MySQL事务,然后执行其工作,这意味着从MySQL数据库中选择/更新/插入/删除,然后回滚 因此,如果数据库处于给定的状态S,我将启动一个任务,当任务终止时,数据库将返回到状态S 当我按顺序启动脚本时,一切正常:多线程事务的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 有些任务随机失败,我有时会出现以下错误:
- 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个数据库需要处理。您是否对正在使用的所有查询运行了“全部解释”功能?您确定不能让它们运行得更快吗?