高并发下数据库插入常见的问题

01 原文出处

原文链接:https://blog.csdn.net/eson_15/article/details/84504059(版权声明:为CSDN博主「eson_15」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。)

02 总结

分析代码:

@Service
public class UserServiceImpl implements UserService {
 
   @Resource
   private UserMapper userMapper;
 
   @Override
   @Transactional(rollbackFor = Exception.class)
   public synchronized void isertUser(User user) {
       try {
           // 插入用户信息
           userMapper.insertUser(user);
           // 手动抛出异常
           throw new SQLException("数据库异常");
       } catch (Exception e) {
           // 异常处理逻辑
       }
   }
}

问题:

1.Spring Boot 默认事务回滚前提:遇到运行异常(RuntimeException)和程序错误(Error)。如果是抛出其它的异常,事务不会回滚。

2.由于事务是AOP设计的,不能在方法里面直接try…catch,这样会导致异常被 “吃” 掉,事务无法回滚。

3.同一方法中,使用同步修饰方法(锁)以及事务注解,由于AOP的原因,事务的控制范围比锁还大,锁是无效的,如上面的实例代码。


解决方案:

  • 调用Service方法之前,使用锁,使锁的范围比事务大(分布式锁或其它)
发布了2618 篇原创文章 · 获赞 4883 · 访问量 39万+

猜你喜欢

转载自blog.csdn.net/qq_20042935/article/details/103890800
今日推荐