首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

类似‘幻读’的django操作

描述现象

之前写了一个的项目,近期在维护和查看的时候,发现了这样一个现象:

当我尝试按照条件删除数据时,删除之后,会重新出现一部分。但逻辑上,并不会和有符合我条件的新增数据,修改后的数据也不可能满足我的删除条件

检查重新出现的数据,很奇怪,通过一个累计字段,我判定这个数据是很早就记录在本地的,但是,记录添加时间的字段却表示它是新增的。

在没有注意到第二点时,推测的是,事务锁造成的幻读。但仔细排查数据的特征,发现,这和幻读并没有关系。

项目中,是通过的查询数据,修改后通过保存数据。

所以,初步的推测是的函数在更新值时,如果数据库中不存在,会执行操作,连都是原本的数据,导致了数据删除不完全。

源码探究

从可以看出,在执行代码时,将走向

更改的值或者直接执行下面的

里面的是会去执行的,因为raw的缺省值是

在中,有如下代码段:

大致意思可以这么理解:

首先会根据pk,即主键去做,看能否正常更新

如果没有正常更新,就执行下面的

这里就能理解,为何删除了数据还会出现,因为数据缓存在了程序中

如何避免

认真查看的使用参数,看如何能避免

更新的时候使用对应的函数

ps:

根据现象到源码,初步是这样推断的,如果有错误,再改正。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180224G0DE5200?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券