我有6个脚本/任务。他们每个人都启动一个MySQL事务,然后完成它的工作,这意味着从MySQL数据库中选择SELECT / UPDATE / INSERT / DELETE,然后回滚。
因此,如果数据库处于给定状态S,我启动一个任务,当任务终止时,数据库返回到状态S.
当我按顺序启动脚本时,一切正常:
但我想通过多线程和并行启动脚本来加快这个过程。
有些任务随机失败,我有时会收到此错误:
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隔离级别下构建和使用的,之后我改变了。
答案 0 :(得分:0)
您可以通过确保每个事务/进程在所有必需的数据/表上执行SELECT ... FOR UPDATE,在所有情况下使用相同的ORDER BY并且具有相同的表自身顺序(至少可重复)来防止死锁读取MySQL中的隔离级别。)
除此之外,隔离级别和事务不意味着处理死锁,反之亦然,它们是死锁存在的原因。如果遇到死锁,很可能会出现数据集状态不一致的情况(可能会更严重 - 如果不是,您可能根本不需要进行交易)。