› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
liudaqi
V2EX  ›  MySQL

灵异事件?!一个 request 里,操作数据掉了一半...

  •  
  •   liudaqi · Jan 20, 2021 · 3653 views
    This topic created in 2107 days ago, the information mentioned may be changed or developed.

    今天遇到一个用户反应数据出错,然后去把数据拉出来核对,真的是错了,只是错误百思不得姐:

    def pipline():
    
        a.name = 'new name'
        sql.session.add(a)
        sql.session.commit()
    
        b.status = 'done'
        sql.session.add(b)
        sql.session.commit()
    
    

    pipline() 是在一个 request 中完成的,程序中没有用事务回滚。结果发现 b.status 存到数据库中了,a.name 在数据库中没有保存下来。

    这个业务流程从来没有出错过,只是有可能用户刚刚在操作的时候,刚好服务器有执行过重启操作,有可能这么巧合吗,把一个 request 中的数据库插入给丢一半、留一半?

    5 replies  •  2021-01-20 20:33:00 +08:00
    v2webdev
        1
    v2webdev  
       Jan 20, 2021
    它俩又不是在同一个事务里,当然有可能不同时提交。
    liudaqi
        2
    liudaqi  
    OP
       Jan 20, 2021
    @v2webdev 也是怀疑到这一步了。疑惑的是,怎么丢的数据不是上半部分,而是后半部分?程序好歹是从上往下执行的,这个 pipline() 大多数时候是在 1 秒之内就能结束的。中途是有 reboot 服务器,还是感到比较灵异
    xupefei
        3
    xupefei  
       Jan 20, 2021 via iPhone
    acid 中并没有定义回滚的优先级,回滚与否和执行时刻无关。
    xupefei
        4
    xupefei  
       Jan 20, 2021 via iPhone
    另外你检查过 commit 是否同步吗?它可能是异步…
    srx1982
        5
    srx1982  
       Jan 20, 2021
    @xupefei 有道理,建议楼主研究一下
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1321 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:14 · PVG 06:14 · LAX 15:14 · JFK 18:14
    ♥ Do have faith in what you're doing.