作多用户操做的系统,必定,必定,必定要考虑“并发”

作多用户操做的系统,必定,必定,必定要考虑“并发”,这种并发,除了系统级别的并发,还有应用级别的并发。若是两我的同时去操做相同的数据,那么要有“第二我的就操做不了”的机制!sql

请你们考虑一套未来再遇到这种问题的解决方案.并发

这里我针对 若是两我的同时去操做相同的数据,那么要有“第二我的就操做不了”的机制!提出一种解决方法:
spa

有一个比较好的办法能够解决这个问题,那就是经过一个单独的能够顺序递增的version字段。改成如下方式便可:code

//查询出商品信息,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操做,不然就执行失败。由于每次操做的版本号都会随之增长,因此同时修改的话只有一个修改生效。blog

 

除了version之外,还可使用时间戳,由于时间戳自然具备顺序递增性:it

  • 首先表里面要增长的一个记录时间戳的字段;
  • 每次更新数据的时候都要更新这个字段的值为最新的时间戳;
  • 而且更新的sql语句里面的where条件必需要有这个字段;

例子:io

UPDATE_AT是时间戳字段,请看以下两条相同的update语句:class

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';

执行结果以下:date

 

结果第一条sql语句执行了,第二条没有执行成功,实现了若是 两我的同时去操做相同的数据,那么要有“第二我的就操做不了”select

相关文章
相关标签/搜索