很多人没有控制并发的意识,即使意识到了,也不知道如何根据业务场景采取合适的手段控制并发,是使用JPA中的乐观锁,还是使用数据库的行级自旋锁完成简单并发控制,还是for update悲观锁,还是基于redis或zookeeper一类的分布式锁?
比如我就是意思到了,但是知道如和处理并发的这类人,来位大佬指点一二。
例如:余额的操作。
public void reduce(String accountId,BigDecimal cost){
Account account = accountService.findOne(accountId);
BigDecimal balance = account.getBalance();
if(balance > cost)
balance = balance - cost;//用四则运算代替BigDecimal的api,方便表达
account.setBalance(balance);
accountService.save(account);
}
阿里巴巴的Java开发手册,推荐用乐观锁,除非极高的并发导致重试率高于20%。
乐观锁的话,好像用JPA不太好实现哦,还是老老实实写SQL语句吧。