spring中service调用service的事务控制

    在使用SPRING的事务控制时,事务一般都是加在SERVICE层的,这个时候如果一个SERVICE调用另一个

SERVICE时有可能会出现事务控制问题,比如第二个SERVICE抛出了异常,第一个SERVICE却正常提交了,

比如下面这个例子:

事务配置

<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 {
        throw new FileNotFoundException("fjkdl");
    }
    当第二个SERVICE抛出异常的时候,第一个SERVICE却正常提交了,USER被加入到了数据库当中。

    先不改配置,我们改下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共享同一事务。

    如果我们改下配置,如下:

<tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
     这个时候,无论SERVICE里抛出运行时异常还是检查型异常,将共享同一事务,也就是说只要有异常,事务

将自动回滚。

    现在只发现了这个问题,如果大家遇到什么问题也可以提出来一起讨论下。

   


  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值