当前位置: 首页 > 知识库问答 >
问题:

包含两个DAO的遗留代码的Spring事务

卢勇
2023-03-14

我正在处理一些遗留代码,其中所有Spring DAO都用@Transactional注释注释。现在我有一个业务需求,我需要在我的服务层中调用两个不同的DAO,如果事务在任何时候失败,就回滚它。

如何在Spring5中实现这一点,而不从DAO中删除@Transactional注释,并且仍然从服务层使用它们。我认为下面的代码不起作用,因为每个DAO中的事务彼此独立。

非常感谢提前。

@Transactional
public FooDao {
}

@Transactional
public BarDao {
}


@Transactional
public TestServiceImple implements TestService {
  fooDao.action1();
  barDao.action2();
}

共有3个答案

陶博涉
2023-03-14

如果您的总体目标是确保事务将回滚通过两个dao调用所做的更改,那么当抛出未经检查的异常时,您应该能够从dao方法本身中删除@transactional,并将其保留在服务层中。Spring中的Transactional可以是类级或方法级的,因此在本例中,您可以只在调用两个dao方法的方法*上使用它(尽管,正如您所指出的,您似乎希望将这些注释保留在dao层中?)。

事务的一般要点之一是在处理多个数据库更改(多个调用道)时,因此在单个道方法(或一般的道层)上使用事务注释不是很好的设计。

如果您的两个DAO处理两个不同的数据源(不确定,您没有提到),那么,如果您有/可以获得spring数据作为依赖项,那么您可以利用ChainedTransactionManager(https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/transaction/ChainedTransactionManager.html)

经博延
2023-03-14

随着传播。@Transaction中的默认值为REQUIRED。第二个方法将使用当前事务@事务性的(propagation=propagation.REQUIRED),因此最终只会有一个事务。

金毅
2023-03-14
  1. @Transactional注释的默认传播类型为传播。必需的

支持当前事务,如果不存在,则创建新事务。

默认情况下,事务将在RuntimeException和Error上回滚,但不会在选中的异常(业务异常)上回滚。

这两种默认配置都将确保fooDao。操作1()barDao。action2()TestServiceImple中使用相同的txn,并在服务层的任何RuntimeException/自定义回滚配置上一起回滚,前提是这两个方法是从使用@Transactional注释的相同服务方法调用的。

实例

 @Transactional
 public TestServiceImple implements TestService {

     public void callDaoMethods(){
      fooDao.action1();
      barDao.action2();
     }

 }

public TestServiceImple implements TestService {

 @Transactional
 public void callDaoMethods(){
   fooDao.action1();
   barDao.action2();
 }
}
 类似资料:
  • 我很难将spring-boot应用程序作为另一个java(非Spring)应用程序的依赖项。 我被要求用一些方法和对Oracle数据库的访问来开发一个新的REST API。为此,我使用了Spring-boot,应用程序本身或部署在服务器上都运行良好。经过几次调整,我把它分成了几个模块,如下所示: models:包含业务代码的模型对象 API:包含业务代码和实际API 对模型有依赖关系 包含连接到数

  • 遗留的XML包装已经废弃了。 FreeMarker 2.3 已经引入了对新的XML处理模型的支持。要支持它, 新的XML包装包已经引入了,就是 freemarker.ext.dom。 对于新用法,我们鼓励你使用。它会在XML处理指南中来说明。 freemarker.ext.xml.NodeListModel 类提供了来包装XML文档展示为结点树模板模型。 每个结点列表可以包含零个或多个XML结点

  • 尽管维基百科上对遗留系统的定义是: 一种旧的方法、旧的技术、旧的计算机系统或应用程序。 但是实际上,当你看到某个网站宣称用新的框架来替换旧的框架的时候,你应该知晓他们原有的系统是遗留系统。人们已经不想在上面工作了,很多代码也不知道是干什么的,也没有人想去深究——毕竟不是自己的代码。判断是否是遗留代码的条件很简单,维护成本是否比开发成本高很多。 几乎无法维护 代码遗失 逻辑不清 没有文档或者不够详细

  • Xml配置: 如果这两个方法中的任何一个(updateSelfAccount,updateAnotherAcccount)失败,则整个事务都应该回滚。但是它不能回滚给定的异常,即使我不确定这一切都发生在一个事务中。请指正。

  • 我有一个database.xml来定义spring事务,比如 和我的dao,服务都在utils包或子包中,比如: 提前感谢您的帮助和建议!

  • 虽然Django最适合用来开发新的应用,但也可以将它整合到遗留的数据库中。Django包含了很多工具,尽可能自动化解决这类问题。 这篇文章假设你了解Django的基础部分,它们在教程中提及。 一旦你的Django环境建立好之后,你可以按照这个大致的流程,整合你的现有数据库。 向Django提供你的数据库参数 你需要告诉Django你的数据库连接参数,以及数据库的名称。请修改DATABASES设置,