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

如何在Spring加入父事务使用@事务注释

太叔凌龙
2023-03-14

我对Spring交易非常陌生。由于我的组织使用的一些代码标准,我要求在调用任何方法时加入父事务(如果存在)。

我的应用程序是一个SpringMVC应用程序,有三层

  1. Web层(控制器类)
  2. 服务层(包含业务逻辑的服务类)
  3. DAO Layer(数据库相关查询的DAO(数据访问层)类)

现在,在服务层上的一个方法中使用了dao层的三种不同方法。我使用@transactional将此服务方法注释为事务性的。现在,我希望从这个服务层方法调用的所有三个dao方法在本质上也是事务性的,并且必须加入由服务层方法启动的父事务,以便为每个dao方法启动其他新的转换。

共有2个答案

吴胜涝
2023-03-14

您可以将@Transactional注释中的传播元素与属性传播一起使用。这样,该方法支持当前事务,或者在没有活动事务时抛出异常。因此,在DAO层中,您可以执行如下操作:

@Transactional(propagation=Propagation.MANDATORY)
public void daoMethod() { // some logic }

秋煌
2023-03-14

您需要使用REQUIRES\u NEWpropagation注释您的服务方法。这将标志着交易的开始。默认情况下,如果由该方法调用,dao方法将继承事务行为并使用现有事务。

但是,如果您想在代码中表示事务边界,您可以使用REQUIRED(如果存在则参与事务,如果不存在则创建新事务)或MANDATORY(如果存在则参与事务,否则抛出一个例外)。

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void serviceMethod() {}

@Transactional(propagation = Propagation.REQUIRED)
public void daoMethod1() {}

@Transactional(propagation = Propagation.REQUIRED)
public void daoMethod2() {}
 类似资料:
  • 在Spring中,由于AOP代理的原因,您不能简单地从同一个实例调用方法。做一个自注入并从自代理实例调用该方法是个好主意吗?你看到什么缺点了吗?

  • 我正在将代码从EJB迁移到Spring-Hibernate。如果发生故障,如何加入事务并回滚?下面是EJB中的代码: 更新1:我们如何连接发生在不同数据库上的两个事务?有2个事务需要原子地执行。如果第二个事务失败,则必须回滚第一个事务。对此如何落实?

  • 问题内容: 之间有什么区别? 在整个类中添加“ @Transactional”注释 为每个方法添加“ @Transactional”注释? 使用spring和Hibernate吗? 问题答案: 基本上,如果您用所有方法注释该类,则将是事务性的。如果您不这样做,则可以仅将其标注为所需的方法。此外,你可以为每个方法指定不同的属性,如,,,…

  • 我正在与用propagation.requires_new注释的方法的奇怪行为作斗争。 以下是TransactionManager的日志:

  • 为什么测试用例需要@Transactional,其功能将在dao层中进行更新(JPA存储库),比如 当测试在没有@Transaction注释的情况下运行时,它会在行中给出以下异常 组织。springframework。刀。InvalidDataAccessApiUsageException:执行更新/删除查询;嵌套的异常是javax。坚持不懈TransactionRequiredException

  • 1. 前言 工作中确实碰到过一些不知道使用事务的朋友,毫无疑问会给项目带来一些风险。 举个简单的例子吧,网购的时候需要扣减库存,同时生成订单。如果扣库存成功了,没生成订单,结果是库存不知道为何变少了;如果生成订单了,没扣库存,那就有可能卖出去的数量比库存还多。 这两种情况都是不能接受的,我们必须保证这两个对数据库的更新操作同时成功,或者同时失败。 事务就是这样一种机制,将对数据库的一系列操作视为一