spring中service调用service如何保持事务一致

本文探讨了Spring框架中的事务管理机制,特别是在Service层如何实现事务的一致性。通过具体示例介绍了不同事务传播行为的作用,并展示了如何配置以确保在调用其他Service时能够保持事务的一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用SPRING的事务控制时,事务一般都是加在SERVICE层的,这个时候如果一个SERVICE调用另一个SERVICE时如何保持事务一致?比如第二个SERVICE抛出了异常,第一个SERVICE回滚。

这就要先介绍spring的7种类型的事务传播行为
这里写图片描述

其中我们要用到第一种,

<tx:method name="add*" propagation="REQUIRED"/> 

测试代码

@Test  
public void testAddUser() throws Exception {  
    UserServiceImpl service = (UserServiceImpl) context.getBean("userServiceImpl", UserServiceImpl.class);  
    USER u = new USER();  
    u.setCreated("2015-05-05");  
    u.setCreator(123);  
    u.setName("test");  
    u.setPassword("test");  
    service.addUser(u);  
}

SERVICE层:

public void addUser(USER user) throws Exception {  
        userDaoImpl.saveUser(user);  
        delByUsername(user.getName());  
    }  

    public void delByUsername(String name) throws Exception {  
//        String s = null;  
//        s.length();  
        throw new RuntimeException("runtime e");  
    } 

让第二个SERVICE抛出运行时异常,测试会发现这个时候第一个SERVICE的事务也回滚了,USER没有插入数据库中。
在事务传播为propagation=”REQUIRED”的时候,如果SERVICE抛出运行时异常,则所有的SERVICE共享同一事务。
如果想要SERVICE抛出所有异常都能回滚,那么就要在propagation="REQUIRED"后面加上rollback-for="Exception"

那么如何在远程调用别人接口(例如dubbo调用)时,保持事务一致性呢?那么就要用到分布式事务了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值