// 保证了只要id值一样就会上锁 而不是根据对象
UserDTO user = UserHolder.getUser();
Long userId = user.getId();
synchronized (userId.toString().intern()) {
// 要实现事务需要通过代理对象
IVoucherOrderService proxy = (IVoucherOrderService) AopContext.currentProxy();
return proxy.getResult(voucherId);
}
@Transactional
public Result getResult(Long voucherId) {
// 一人一单
UserDTO user = UserHolder.getUser();
Long userId = user.getId();
// 锁加在这个位置不能确保事务提交了
// synchronized (userId.toString().intern()) {
Integer count = seckillVoucherService.query().eq("user_id", userId).eq("voucher_id", voucherId).count();
if (count >= 1) {
return Result.ok("用户已经购买过了!");
}
// 是的话 更新数据库 创建订单 返回订单id
boolean flag = seckillVoucherService.update().setSql("stock = stock-1").
eq("voucher_id", voucherId).gt("stock", 0)
.update();
if (!flag) {
return Result.fail("活动已经结束!");
}
// 生成订单
// 订单id 用户id 代金卷的id
VoucherOrder voucherOrder = new VoucherOrder();
// 代金卷id
voucherOrder.setVoucherId(voucherId);
// 订单id
long orderId = redisWorker.generateId("order");
voucherOrder.setId(orderId);
// 用户id
voucherOrder.setUserId(userId);
// 保存
save(voucherOrder);
return Result.ok(orderId);
// }
}