做多用户操作的系统,一定,一定,一定要考虑“并发”,这种并发,除了系统级别的并发,还有应用级别的并发。如果两个人同时去操作相同的数据,那么要有“第二个人就操作不了”的机制!
请大家考虑一套将来再遇到这种问题的解决方案.
这里我针对 如果两个人同时去操作相同的数据,那么要有“第二个人就操作不了”的机制!提出一种解决方法:
有一个比较好的办法可以解决这个问题,那就是通过一个单独的可以顺序递增的version字段。改为以下方式即可:
//查询出商品信息,version = 1 select version from items where id=1 //修改商品库存为2 update items set quantity=2,version = version+1 where id=1 and version = 1;
每次在执行数据的修改操作时,都会带上一个版本号,一旦版本号和数据的版本号一致就可以执行修改操作并对版本号执行+1操作,否则就执行失败。因为每次操作的版本号都会随之增加,所以同时修改的话只有一个修改生效。
除了version以外,还可以使用时间戳,因为时间戳天然具有顺序递增性:
- 首先表里面要增加的一个记录时间戳的字段;
- 每次更新数据的时候都要更新这个字段的值为最新的时间戳;
- 并且更新的sql语句里面的where条件必须要有这个字段;
例子:
UPDATE_AT是时间戳字段,请看如下两条相同的update语句:
update "AREACODE" set "UPDATE_AT"=now() where "GCODE"='510303' AND "UPDATE_AT"='2019-06-19 17:02:42.755857'; update "AREACODE" set "UPDATE_AT"=now() where "GCODE"='510303' AND "UPDATE_AT"='2019-06-19 17:02:42.755857';
执行结果如下:
结果第一条sql语句执行了,第二条没有执行成功,实现了如果 两个人同时去操作相同的数据,那么要有“第二个人就操作不了”