Java高并发秒杀系统API
-- 秒杀成功明细表
-- 联合主键
PRIMARY KEY (seckill_id, user_phone),
在这里使用秒杀商品id+用户手机号作为秒杀成功的一个联合主键。当用户使用该手机秒杀同一件商品时从数据库层面来说是不允许的。 可以从单元测试的日志查看:
private static final Log log = LogFactory.get();
@Test
public void testInsertSuccessKilled() {
String seckillId = "c18c169938c311e89fa754ee75c6aeb0";
String userPhone = "18701012345";
int insertCount = successKilledMapper.insertSuccessKilled(seckillId, userPhone);
log.info("insertCount: {}", insertCount);
}
执行结果:
INFO cn.colg.dao.SuccessKilledMapperTest - insertCount: 1
表示插入成功INFO cn.colg.dao.SuccessKilledMapperTest - insertCount: 0
表示插入失败 <!-- 配置基于注解的声明式事务 - 默认使用注解来管理事务行为 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
@Transactional(propagation=Propagation.REQUIRED) :如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)
@Transactional(propagation=Propagation.NOT_SUPPORTED) :容器不为这个方法开启事务
@Transactional(propagation=Propagation.REQUIRES_NEW) :不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
@Transactional(propagation=Propagation.MANDATORY) :必须在一个已有的事务中执行,否则抛出异常
@Transactional(propagation=Propagation.NEVER) :必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)
@Transactional(propagation=Propagation.SUPPORTS) :如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.
@Transactional(timeout=30) //默认是30秒
According to TLD or attribute directive in tag file, attribute value does not accept any expressions
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%> 改为 <%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jstl/fmt" prefix="fmt"%> 改为 <%@ taglib uri="http://java.sun.com/jstl/fmt_rt" prefix="fmt"%>
mvn tomcat7:run