java controller 事务,如何在Controller层实现事务管理?

在spring aop 事务管理中发现,我们是在service层实现的事务管理。

现在有如下场景,大家讨论下看如何实现?

ControllerA、ControllerB、ControllerC….共同依赖ServiceA、ServiceB,上述Controller的save操作需要把数据同步ServiceA和ServiceB。

由于每个Controller保存ServiceB的extraData字段是通过Json组装的,所以每个Controller具有独特性。如果在Service层实现事务管理,ServiceA将会变的异常庞大,需要判断是哪个Controller过来的数据,然后组装ServiceB的extraData字段。

另一种思路,我们是否可以把每个Controller组装ServiceB的extraData字段过程放在各自的Controller,然后在Controller实现事务管理呢?

经过测试,在Controller层加事务,在spring.xml的aop:config添加对Controller的声明式事务拦截,结果未生效。在Controller的class加上@Transactional也未生效。最后采取的编程式事务实现的。

我们在Spring.xml配置sessionFactory和transactionManager,如果已经配置声明式事务,这步可以忽略。

#{ nplat['db.dialect'] }

none

after_transaction

false

false

3

50

30

none

com.gina.gc

然后在每个Controller注入transactionManager:

@Resource

private PlatformTransactionManager transactionManager;

下面讲解如何在Controller的save方法加上编程式事务:

@RequestMapping("/save")

@ResponseBody

public String save(@Validated BaseSetting info) {

DefaultTransactionDefinition defaultTransactionDefinition = new DefaultTransactionDefinition();

defaultTransactionDefinition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

TransactionStatus status = transactionManager.getTransaction(defaultTransactionDefinition);

try {

serviceA.save(A);

serviceB.save(B);

...

transactionManager.commit(status);

} catch (Exception e) {

transactionManager.rollback(status);

e.printStackTrace();

log.error("sava *** error" + e.toString());

return ERROR(e.toString());

}

return OK();

}

这样我们便实现了在Controller层加上事务管理。 虽说大家建议把事务加在Service,但不同情况不同处理方案,真正到项目中还得综合考虑,灵活运用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值