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

在现有事务方法上包装事务?

卫仲卿
2023-03-14

如果我有一个在类级别上标记为@Transactional的基本Dao类,这将导致Dao的每个调用都在它自己的事务中运行。

如果我在某个地方创建了一个方法,它使用多个对不同道方法的调用,会怎么样?这些调用中的每一个都将在自己的事务中运行,还是事务将被包装?

@Service
@Transactional
class BaseDao<T> {
    //each of these methods will run in a transaction
    public void save(T entity) { }
    public void update(T entity) { }
}

@Service
class PersonFacade() {
    //will this "wrapp" the transaction?
    @Transactional
    void update() {
        dao.find();
        dao.update();
    }
}

如果它被包装,你会认为这是一个很好的做法,在一个通用的DAO类中有<代码> @事务性< /代码>注释,以便DAO可以直接用作<代码> @ AutoWordBaseDaO。

或者我应该更好地从基本dao中删除该事务?

共有1个答案

澹台正业
2023-03-14

如果将两个调用都包装到一个也标记为@Transactional的方法中,那么只有一个事务可以跨越所有事务。

我认为DAO类不应该有@事务性注释。将它们放入提供“业务方法”的服务类。只有那些人知道哪个DAO方法调用(可能来自多个实体)来组成有意义的事务。

另请参见@Transactional注释属于何处?

 类似资料:
  • 我想在我的应用程序开始时读取文本数据夹具(CSV文件),并将其放入数据库。 为此,我创建了一个带有初始化方法的PopulationService(@PostConstruct注释)。 我还希望它们在单个事务中执行,因此我在同一个方法上添加了@Transactional。 然而,@Transactional似乎被忽略了:事务在我的低级DAO方法中启动/停止。 那么我需要手动管理交易吗?

  • 我正在尝试创建一个事务方法,该方法调用其他几个事务方法以保存一些相互依赖的db实体。如果任何调用失败,我希望事务完全回滚。但是,这不是观察到的行为。这是我的代码: 也有and,但是当事务在第二次调用时失败时,第一个被提交。

  • 我使用的是Spring Boot 2.5.2和Spring Cloud 2020.0.3。我正在尝试包装一个rest服务调用,该调用使用JPA(CrudRepository.save)将记录保存到DB,然后使用StreamBridge使用spring cloud stream(Kafka binder)将消息发布到Kafka主题。我试过好几种方法,但似乎没有一种效果很好。我故意造成JPA问题(插入

  • 本文向大家介绍spring 事务实现方式有哪些?相关面试题,主要包含被问及spring 事务实现方式有哪些?时的应答技巧和注意事项,需要的朋友参考一下 声明式事务:声明式事务也有两种实现方式,基于 xml 配置文件的方式和注解方式(在类上添加 @Transaction 注解)。 编码方式:提供编码的形式管理和维护事务。

  • 我创建了一个MySQL数据库,并填充了用于测试的行。我想在这个数据库上进行DAO单元测试。每个都是,因此每次测试后都会进行回滚。不幸的是,它无法工作,因为我的数据库仍在进行更改。 我正在用以下上下文加载Spring配置。xml 这个问题说我 必须在应用程序上下文中提供bean 但即使有了它(在我的上下文中是),什么都没有发生,我的数据库仍然被修改,没有回滚。 这是我的DAO测试课 在我的配置中,或

  • 我正在从非事务类try块(由另一个EJB类调用)调用事务方法a,该块将引发RuntimeException 然后在catch块中,事务方法b将处理exp。 令人惊讶的是,我必须用“REQUIRES\u NEW”注释方法B,否则程序将出现“Transaction is not active”异常。(stacktrace与此类似) 这是否是因为方法A的事务(标记为RuntimeException的回滚