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

2021-01-20 18:44:44 +08:00
 liudaqi

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

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 中的数据库插入给丢一半、留一半?

2455 次点击
所在节点    MySQL
5 条回复
v2webdev
2021-01-20 19:20:36 +08:00
它俩又不是在同一个事务里,当然有可能不同时提交。
liudaqi
2021-01-20 19:26:57 +08:00
@v2webdev 也是怀疑到这一步了。疑惑的是,怎么丢的数据不是上半部分,而是后半部分?程序好歹是从上往下执行的,这个 pipline() 大多数时候是在 1 秒之内就能结束的。中途是有 reboot 服务器,还是感到比较灵异
xupefei
2021-01-20 19:32:46 +08:00
acid 中并没有定义回滚的优先级,回滚与否和执行时刻无关。
xupefei
2021-01-20 19:35:13 +08:00
另外你检查过 commit 是否同步吗?它可能是异步…
srx1982
2021-01-20 20:33:00 +08:00
@xupefei 有道理,建议楼主研究一下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/746796

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX