1.redis加锁 需要看 加锁的是什么方法 ,比如买标的, 加锁的就是要 加锁标的 id,加锁活动 加锁活动的id
其他的类似, 共享数据 需要加锁,防止用户过多造成并发问题
2.由于Spring事务是通过AOP实现的,所以在luckDraw方法执行之前会有开启事务,
之后会有提交事务逻辑。而redis加锁代码块执行是在事务之内执行的
,可以推断在redis加锁代码块执行完时,
事务还未提交,其他线程进入redis加锁的代码块后,读取的库存数据不是最新的。
3.如果spring设置事务自己提交 需要 把@Transactional 去掉, 然后
@Autowired
private DataSourceTransactionManager txManager;
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);// 事物隔离级别,开启新事务
TransactionStatus status = txManager.getTransaction(def); // 获得事务状态
txManager.commit(status); //提交事务
- 也就是说 redis加锁 需要在controller 层加锁