加事务注解;
@Transactional
先修改商品库存量,update
之后查询商品库存量是否大于0,若是小于则,rollback(TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();)
保证查询准确,for update(行级锁,属于悲观锁。commit 或 rollback 释放锁定)
乐观锁
CAS(Compare and Swap),会出现ABA的问题;在一个线程查询时,其它线程做了多次改动数据的操作,加一又减一,最终未发现数据是否改变。未解决ABA问题,可在sql语句上改变,任何线程操作都将改变sql数据固定值递增,或递减。这样线程在操作数据时,可带着固定值进行判断是否已经改变过了。
select version from activity where id=1
update activity set a=2,version =version+1 where id =1 and version=1
乐观锁相较于悲观锁,效率高。
同步锁
synchroized
乐观是真的乐观,就是简单的CAS,在出现ABA的情况下,乐观锁就要改变了,比如sql,
悲观锁,就都认为我要rollback,每条我都看一下是否要rollback,判断一下,这样效率当然就低了
同步锁:轻量级锁,偏向锁,自旋锁,重量级锁