spring中@transactional事务提交时间点
在spring中,使用@transactional注解可以声明方法为事务方法,对数据进行操作。然而,事务的提交点是何时呢?是方法执行结束后还是执行结束前?
这个问题困扰了许多开发者,尤其是在并发情况下,准确掌握事务提交点至关重要。
方法执行结束后
@transactional注解被spring的aop框架实现。spring使用动态代理创建事务方法的代理,并在方法执行前后的特定切点执行操作,包括事务的开启和提交。
因此,事务实际上是在方法执行结束后提交的。
并发情况下防止超卖
在并发情况下,如果方法执行后立即解锁,就有可能出现超卖问题。假设多个线程同时调用方法,线程1执行完成后但事务尚未提交。这时,线程2获取锁并执行方法,它在可重复读隔离级别下无法看到线程1对库存的操作,从而导致超卖。
要防止超卖,需要确保事务在解锁之前提交。
解决方案
对方法进行适当的重构,将锁操作放在事务提交之后。例如:
public Result func(long seckillId, long userId) {
// 执行数据库操作——查询商品库存数量
// 如果 库存数量 满足要求
lock.lock();
try {
// 执行数据库操作——减少库存数量——模拟卖出货物操作
return Result.SUCCESS;
} finally {
lock.unlock();
}
}
这种方式下,事务在解锁之前提交,确保了并发情况下不会出现超卖问题。
以上就是Spring中@Transactional事务什么时候提交?的详细内容,更多请关注编程网其它相关文章!