脏数据和时间戳,还有数据一致性校验

    今天在开发补货管理模块时,要新增加一个接口,功能是可以修改补货管理表里的订单状态。

    在数据库里,由一个orderStatus字段来表示订单的当前状态,而这个状态可以由两种用户角色进行修改。一个是加工厂,另一个是供应商。之前在写方法的时候,还没体会到数据一致性的问题。但是昨天由老欧写了一个接口给我看了之后,发现比我写的方法多用到了表里的lastModifiedOn和modifiedBy字段。来校验数据。心里有些疑惑,就让他给我讲讲这方面的东西。

    他说:A在修改状态的时候,从前端获取到的状态是1,要将其修改成3.但是在这个过程中,B用户已经把状态修改成2了,那么,A获取到的状态1,就成为脏数据。:

脏数据在临时更新(脏读)中产生。事务A更新了某个数据项X,但是由于某种原因,事务A出现了问题,于是要把A回滚。但是在回滚之前,另一个事务B读取了数据项X的值(A更新后),A回滚了事务,数据项恢复了原值。事务B读取的就是数据项X的就是一个“临时”的值,就是脏数据。

    在项目里:整个业务流程由spo.tpl    spo.controller.php    spo.SCA.php    spo.model.php 组成。

tpl显示数据,controller组织数据,SCA发布接口,model实现接口。A用户在修改tpl上显示的数据的时候,一起取到了<input type="hidden" value="{$lastModifiedOn}"}里面的$lastModifiedOn的值为10:00,而SCA里在准备对订单状态进行修改的时候,先从数据库里取出$lastModifiedOn,和传进来的时间戳进行比对,如果两者一致,证明数据一致性没有问题。这时再进行修改。如果两个时间戳不一样,就必须中止写入,重新校验。

    在每次更新数据时,都必须执行这一步。不然老欧很生气!后果很严重!

    (PS:为什么MySQL里用来表示时间戳的字段要用datetime来存储而不用INT来存储unix时间呢,一个int比datetime更快,另外也不用考虑时区的问题,更方便。明天得问下他才行。)

转载于:https://my.oschina.net/kwansblog/blog/93353

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值