image.png
- 使用数据库锁进行秒杀功能实现(但是在大的项目中根本不会这样使用)
- DAO层的代码
公式:UPDATE T_SEC_GOODS SET NUM=NUM-#{num} WHERE SKU=#{sku} AND NUM-#{num}>0
@Mapper
public interface KillDao {
// 进行商品库存扣减
@Update("UPDATE T_SEC_GOODS SET NUM=NUM-#{num} WHERE SKU=#{sku} AND NUM-#{num}>0")
int updateGoodsCount(Map<String,Object> param);
}
- Service层
@Service
public class KillServiceImpl implements KillService {
@Resource
KillDao killDao;
@Override
@Transactional
public boolean updateGoodsCount(int num, String sku) {
Map<String , Object> param = new HashMap<>();
param.put("num",num);
param.put("sku",sku);
return killDao.updateGoodsCount(param)>0?true:false;
}
}
- 测试类编写(切记使用原子类进行数字查看,这个是最简单的测试)
@RunWith(SpringRunner.class)
@SpringBootTest
public class SeckillApplicationTests {
public static final String SKU = "iPhone7";
public static int UserCount = 5;
public static int UserBuyCount = 3;
public static AtomicInteger userSuccessCount = new AtomicInteger();
public static AtomicInteger stackSuccessCount = new AtomicInteger();
@Resource
KillService killService;
@Test
public void contextLoads() {
boolean flag = killService.updateGoodsCount(1, SKU);
System.out.println("------------------数据更新成功:"+flag);
}
@Test
public void contextLoadsThread() throws InterruptedException {
for (int i = 0; i < UserCount; i++) {
Thread task = new Thread() {
@Override
public void run() {
if (killService.updateGoodsCount(UserBuyCount, SKU)){
System.out.println("------------------数据更新成功");
userSuccessCount.incrementAndGet();//购买成功用户加一
stackSuccessCount.addAndGet(UserBuyCount);//购买成功商品
}else {
System.out.println("------------------数据更新失败");
}
}
};
task.start();
task.join();
}
System.out.println("------------------购买成功人数:"+userSuccessCount);
System.out.println("------------------购买成功商品:"+stackSuccessCount);
}
}
- 测试类编写(控制线程数量,)
1283

被折叠的 条评论
为什么被折叠?



