在高并发的情况下,数据在update时可能会溢出。就是超出你想要的一个范围。我们可以使用乐观锁来解决。
添加一个verison字段,把verison查出来,比如我查出来当前这一条的数据的verison是3,当我要执行update时,判段我查出的verison是否是最新了verison.。
像这样
update test set test_column=0 where verison=3
这样在高访问情况下,就不会出错
如果上条语句没有正确执行,就代表数据己经更新过了,己经不是我之前查出来verison为3的数据了。我要重新进行查询。如果正确执行了,就代表我的数据行是最新的,可以进行更新,然后让此数据行的verison自增+1。
举个例子,例如商品的超买,一个用户把一个商品加入购物车时,我们要判段商品的库存是否为零,然后把商品的库存减1,可是在高并发的情况,如果当前的库存为1的时候可能会有多个程序进程同时读取数据库,这些进程得到的库存都是不为零,所以这些进程都会执行update,导至库存为负数。
这时我们就要上乐观锁了,在update时候判段我这个进程所查出来数据行的version是不是最新的。判段方法就是update时判段我这个进程查出来的数据行version是不是最新verison。如果执行失败,就代表不是最新的。这时,我们就要重新查询库存数量。