您当前的位置: 首页 >  数据库

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

杨林伟 发布时间:2020-01-08 14:42:37 ,浏览量:2

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方法之前,使用锁,使锁的范围比事务大(分布式锁或其它)
关注
打赏
1688896170
查看更多评论

杨林伟

暂无认证

  • 2浏览

    0关注

    3279博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.0523s