Redisson分散式鎖執行緒安全多執行緒

當前分散式微服務解決網際網路的高併發、高穩定、高吞吐等問題的同時也帶來了一些問題,最大的問題就是公共變數資料的正確性問題,怎麼解決多個服務能正確使用公共變數呢?就是分散式鎖。比如搶單,12306買票等。

/** * 下單&支付 * * @param dto * @return */@Override@Transactional(propagation = Propagation。REQUIRED,rollbackFor = Exception。class)public Boolean saveOrder(OrderDTO dto) { Assert。isTrue(!StringUtils。isEmpty(dto。getOrderNo()), “產品編號不能為空”); Assert。isTrue(dto。getAmount() > 0, “購買數量不能為0”); RLock lock = redissonClient。getLock(MachineConstant。LOCK_MACHINE_PREFIX + dto。getProductNo()); boolean isLock = false; try { isLock = lock。tryLock(3, 10, TimeUnit。SECONDS); } catch (InterruptedException e) { log。info(“get distributed lock failed!”); return false; } if (isLock) { try { Product product = productService。getOne(Wrappers。lambdaQuery()。eq(Product::getProductNo, dto。getProductNo())); BatUser user = SecurityUtils。getUser(); Order order = new Order(); BeanUtils。copyProperties(dto, order); order。setOrderNo(sequence。nextNo()); order。setUid(user。getId()); order。setPrice(product。getPrice()); order。setTotalPrice(product。getPrice() * dto。getAmount()); order。setStatus(Order。STATUS_0); order。setOrderType(Order。ORDER_TYPE_0); order。setProductName(product。getProductName()); if (save(order)) { //扣款(資產帳戶) CoinSyncResult result = remoteCoinService。add( order。getPayType(), BigDecimal。valueOf(Long。valueOf(order。getTotalPrice())), order。getUid(), AccountType。ASSET_ACCOUNT。getType(), MachineConstant。BUSINESS_MACHINE, AccountAction。MINUS, order。getOrderNo() ); if (result。getCode() != AccountCode。SUCCESS) { log。info(“order:{} pay failed”, order。getOrderNo()); } else { Order newOrder = getById(order。getId()); newOrder。setStatus(Order。STATUS_1); newOrder。updateById(); // 傳送扣款財務記錄訊息 Map expandField = new HashMap<>(1); expandField。put(“type”, “coin_machine”); FinanceMessage message = new FinanceMessage( AccountType。ASSET_ACCOUNT。getType(), order。getPayType(), order。getUid(), BigDecimal。valueOf(Long。valueOf(order。getTotalPrice())), FinanceMessage。Operation。SUB, AccountDetailType。OUT。name(), expandField ); message。setRemark(“COIN_MACHINE”); Message msg = MessageBuilder。withPayload(message)。build(); messageSource。financeOutput()。send(msg); } return true; } } finally { lock。unlock(); } } return false;}