描述现象
之前写了一个的项目,近期在维护和查看的时候,发现了这样一个现象:
当我尝试按照条件删除数据时,删除之后,会重新出现一部分。但逻辑上,并不会和有符合我条件的新增数据,修改后的数据也不可能满足我的删除条件
检查重新出现的数据,很奇怪,通过一个累计字段,我判定这个数据是很早就记录在本地的,但是,记录添加时间的字段却表示它是新增的。
在没有注意到第二点时,推测的是,事务锁造成的幻读。但仔细排查数据的特征,发现,这和幻读并没有关系。
项目中,是通过的查询数据,修改后通过保存数据。
所以,初步的推测是的函数在更新值时,如果数据库中不存在,会执行操作,连都是原本的数据,导致了数据删除不完全。
源码探究
从可以看出,在执行代码时,将走向
更改的值或者直接执行下面的
在
里面的是会去执行的,因为raw的缺省值是
在中,有如下代码段:
大致意思可以这么理解:
首先会根据pk,即主键去做,看能否正常更新
如果没有正常更新,就执行下面的
这里就能理解,为何删除了数据还会出现,因为数据缓存在了程序中
如何避免
认真查看的使用参数,看如何能避免
更新的时候使用对应的函数
ps:
根据现象到源码,初步是这样推断的,如果有错误,再改正。
领取专属 10元无门槛券
私享最新 技术干货