做网站的一般多少钱,科技型中小企业服务平台登录,怎么在百度上发帖推广,网站开发软件选择一、需求 最常见的一个场景#xff0c;账户余额更新#xff01; 业务场景稍复杂点#xff0c;一个客户有多个虚拟余额账户#xff0c;产生交易时#xff0c;需要同时更新客户的多个余额账户#xff0c;现在需要为余额更新做并发控制。 二、解决方案 1、依赖数据的乐观锁账户余额更新 业务场景稍复杂点一个客户有多个虚拟余额账户产生交易时需要同时更新客户的多个余额账户现在需要为余额更新做并发控制。 二、解决方案 1、依赖数据的乐观锁内存中不做更新余额的判断update语句中增加条件扣减的金额必须小于当前余额代码中以返回的更新行数判断是否扣减成功。 2、由于一些原因逼着这里采用的是代码中加锁来解决的首先需要明确一个前提如下代码中加同步锁的方案是针对单节点的服务若是多节点则无法控制并发了。 三、核心代码
锁的颗粒度最暴力的同步锁就是整个方法加同步这样是以牺牲接口性能为代价一刀切的做法笔者这里实现的是按客户余额账号加锁同一个账号账号唯一更新余额加锁控制即可不同的账户可以同时更新余额逻辑上并不冲突。
/*** 账户信息*/
Slf4j
Component
public class AccountDemo{// 同步锁容器一定注意容器必须是线程安全的private final MapString, Object accountLocks new ConcurrentHashMap();public int updateBalance( String accountNo, long amount) {if (StrUtil.isBlank(accountNo)) {throw new ServiceException(EnumErrorCode.EC_COMMON_REQ_PARAM_ERROR);}if (amount 0) {log.warn(amount is zero.);return 1;}// 根据账户ID获取或创建锁对象Object lock accountLocks.computeIfAbsent(accountNo, k - new Object());synchronized (lock) {// 判断客户余额是否充足if (checkBalance(accountNo, amount)) {throw new ServiceException(余额不足); }// 更新余额代码实现int update updateBalance(accountNo, amount);}return update;}}注意该方法或方法上游加事务控制要特别小心笔者在外层增加了事务控制就导致了方法里面锁的执行顺序控制失效了