Spring事务中的事务传播行为使用方式详解

 更新时间:2023年06月27日 08:26:46   作者:Cosolar  
Spring框架作为一个轻量级的开源框架,在企业应用开发中被广泛使用,在Spring事务管理中,事务传播行为是非常重要的一部分,它定义了方法如何参与到已经存在的事务中或者如何开启新的事务,本文将详细介绍Spring事务中的几种事务传播行为,详细讲解具体使用方法

1. REQUIRED 传播行为

REQUIRED是Spring事务管理的默认传播行为。如果当前没有事务,则新的事务将被开启;如果当前存在事务,则方法将参与到当前事务中。下面是REQUIRED传播行为的使用方式:

@Service
@Transactional
public class UserServiceImpl implements UserService{
    @Autowired
    private UserDao userDao;
    @Override
    public void updateUser(User user) {
        // 具体业务逻辑
    }
    @Override
    @Transactional(propagation = Propagation.REQUIRED)
    public void transferMoney(int fromUserId, int toUserId, double amount) {
        User fromUser = userDao.getUserById(fromUserId);
        User toUser = userDao.getUserById(toUserId);
        double fromUserBalance = fromUser.getBalance();
        if(fromUserBalance < amount){
            throw new RuntimeException("余额不足");
        }
        fromUser.setBalance(fromUserBalance - amount);
        toUser.setBalance(toUser.getBalance() + amount);
        userDao.updateUser(fromUser);
        userDao.updateUser(toUser);
    }
}

2. REQUIRES_NEW 传播行为

REQUIRES_NEW表示当前方法必须开启新的事务,并挂起当前事务(如果存在)。下面是REQUIRES_NEW传播行为的使用方式:

@Service
@Transactional
public class OrderServiceImpl implements OrderService{
    @Autowired
    private OrderDao orderDao;
    @Override
    public void createOrder(Order order) {
        // 具体业务逻辑
    }
    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void updateOrderStatus(int orderId, int status) {
        Order order = orderDao.getOrderById(orderId);
        order.setStatus(status);
        orderDao.updateOrder(order);
    }
}

3. SUPPORTS 传播行为

SUPPORTS表示当前方法支持参与到一个已经存在的事务中,如果当前没有事务,则以非事务方式执行。下面是SUPPORTS传播行为的使用方式:

@Service
@Transactional
public class LogServiceImpl implements LogService{
    @Autowired
    private LogDao logDao;
    @Override
    public void addLog(Log log) {
        // 具体业务逻辑
    }
    @Override
    @Transactional(propagation = Propagation.SUPPORTS)
    public void deleteLog(int logId) {
        logDao.deleteLog(logId);
    }
}

4. NOT_SUPPORTED 传播行为

NOT_SUPPORTED表示当前方法以非事务方式执行,如果当前存在事务,则挂起该事务。下面是NOT_SUPPORTED传播行为的使用方式:

@Service
@Transactional
public class ProductService{
    @Autowired
    private ProductDao productDao;
    @Transactional(propagation = Propagation.NOT_SUPPORTED)
    public void updateProductStock(int productId, int quantity){
        // 具体业务逻辑
    }
}

5. NEVER 传播行为

NEVER表示当前方法以非事务方式执行,如果当前存在事务,则抛出异常。下面是NEVER传播行为的使用方式:

@Service
@Transactional
public class OrderServiceImpl implements OrderService{
    @Autowired
    private OrderDao orderDao;
    @Override
    public void createOrder(Order order) {
        // 具体业务逻辑
    }
    @Override
    @Transactional(propagation = Propagation.NEVER)
    public void deleteOrder(int orderId) {
        Order order = orderDao.getOrderById(orderId);
        orderDao.deleteOrder(order);
    }
}

Spring事务管理中的事务传播行为对于设计和管理复杂的事务场景非常重要。本文详细介绍了几种常用的事务传播行为,并提供了相应的代码示例。开发者可以根据实际需求选择合适的事务传播行为,从而实现事务的管理与控制。

通过对Spring事务中事务传播行为的深入理解,开发者可以更好地设计和管理事务,提高应用程序的可靠性和稳定性。在实际开发中,根据业务需求合理选择事务传播行为,可以避免事务覆盖和事务的不一致等问题,并且提升系统的性能和并发能力。

以上就是Spring事务中的事务传播行为使用方式详解的详细内容,更多关于Spring事务传播行为的资料请关注脚本之家其它相关文章!

相关文章

  • MyBatis实现多表联合查询resultType的返回值

    MyBatis实现多表联合查询resultType的返回值

    这篇文章主要介绍了MyBatis多表联合查询resultType的返回值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java关键字this(动力节点Java学院整理)

    Java关键字this(动力节点Java学院整理)

    java中的this随处可见,用法也多。通常情况下理解this关键字还是很容易的,但是在我初学的时候,有一个疑问却一直不能很清晰的理解,现在慢慢的理解了,下面通过本文给大家记录下,有需要的朋友参考下
    2017-03-03
  • Spring Cloud负载均衡组件Ribbon原理解析

    Spring Cloud负载均衡组件Ribbon原理解析

    本文主要讲述了微服务体系下的 Spring Cloud Netflix 套件中 Ribbon 的使用,并结合部分源码讲述了 Ribbon 的底层原理,重点讲述了 Ribbon 中是如何获取服务以及如何判定一个服务是否可用,最后也介绍了 Ribbon 中默认提供的 7 种负载均衡策略,感兴趣的朋友一起看看吧
    2022-04-04
  • java 查找替换pdf中的指定文本

    java 查找替换pdf中的指定文本

    这篇文章主要介绍了java 如何查找替换pdf中的指定文本,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-12-12
  • java实现异步导出数据

    java实现异步导出数据

    这篇文章主要为大家详细介绍了java实现异步导出数据,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • Java实现在Word中嵌入多媒体(视频、音频)文件

    Java实现在Word中嵌入多媒体(视频、音频)文件

    这篇文章主要介绍了Java如何实现在Word中嵌入多媒体(视频、音频)文件,文中的示例代码讲解详细,对我们学习java有一定的帮助,感兴趣的同学可以了解一下
    2021-12-12
  • 工作中禁止使用Executors快捷创建线程池原理详解

    工作中禁止使用Executors快捷创建线程池原理详解

    这篇文章主要为大家介绍了工作中禁止使用Executors快捷创建线程池原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • 纯Java代码实现流星划过天空

    纯Java代码实现流星划过天空

    本文给大家介绍纯java代码实现流星划过天空,包括流星个数,流星飞行的速度,色阶,流星大小相关变量设置。对java流星划过天空特效代码感兴趣的朋友可以参考下本文
    2015-10-10
  • 对Java字符串与整形、浮点类型之间的相互转换方法总结

    对Java字符串与整形、浮点类型之间的相互转换方法总结

    今天小编就为大家分享一篇对Java字符串与整形、浮点类型之间的相互转换方法总结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Java远程共享目录的操作代码

    Java远程共享目录的操作代码

    这篇文章主要介绍了java操作远程共享目录的实现代码,非常不粗,具有参考借鉴价值,需要的朋友可以参考下
    2017-08-08

最新评论