V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qize0921
V2EX  ›  Django

Django 加上事务后报异常: Deadlock found when trying to get lock; try restarting transaction

  •  
  •   qize0921 · 2021-03-15 15:35:24 +08:00 · 1964 次点击
    这是一个创建于 1378 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Django 项目, 用的是 Mysql 数据库, 服务器开了 16 个线程在跑, 有加事务, 然后访问量上来后, 日志中时不时会出现 "Deadlock found when trying to get lock; try restarting transaction" 这样的异常, 这个异常是加事务那块代码抛出的

    在事务包裹的代码里, 大概执行了以下操作:

    • A 表 创建一条数据
    • 更新 A 表 外键中 B 表 的字段, 并保存
    • 更新 C 表 的字段, 并保存

    网上查了查 有的说是外键问题, 有的说是两条数据同时操作同一个表的问题, 没太搞明白, 想请教一下有没有遇到过类似情况的, 指点一下

    2 条回复    2021-03-16 11:34:42 +08:00
    jenlors
        1
    jenlors  
       2021-03-16 10:12:20 +08:00   ❤️ 1
    明显是出现了死锁,看看事务包裹的代码是不是执行时间太长,尝试将一个大事务拆分为多个小事务,事务里面不要有网络请求等。
    qize0921
        2
    qize0921  
    OP
       2021-03-16 11:34:42 +08:00
    @long2ice 感谢回复 我检查了下代码 发现确实有相关的操作 应该是执行时间太长导致的 我已经修改 之后再观察观察
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2835 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 11:54 · PVG 19:54 · LAX 03:54 · JFK 06:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.