【问题标题】:Is the CrudRepository .delete() method transactional?CrudRepository .delete() 方法是事务性的吗?
【发布时间】:2016-04-15 14:26:33
【问题描述】:

使用 Spring-data 时,可以扩展 CrudRepository。

这个 Repositories .delete() 方法是如何“在后台”工作的?

另外,这个方法是Transactional吗?如果是这样的话,在使用Spring-data的时候是否需要使用@Transactional注解。

例如这里需要@Transactional 吗? :

扩展 CrudRepository:

public interface PersonRepository extends CrudRepository<Person, Integer> {

}

在服务类中使用删除方法:

 @Transactional
 public void deletePerson(Person person) {

        personRepository.delete(person);
    }

编辑:@Transactional 在这里如何工作?

 @Transactional
     public void deletePersonAndTable(Person person, Table table) {

            personRepository.delete(person);

            tableRepository.delete(Table);

        }

【问题讨论】:

  • 定义“扩展 CrudRepository”。您的示例代码正是这样做的;不?对数据库进行任何操作都需要一个事务,因此这里不需要 @Transactional 注释 - 需要将多个 DAO 操作分组到一个事务中。
  • 您是否尝试删除@Transactional 并查看事务是否已提交?
  • @BoristheSpider 只是展示我的存储库如何扩展 CrudRepository?您能否定义您的意思:“需要将多个 DAO 操作分组到单个事务中”?谢谢
  • 如果在您的方法中删除有多个数据库访问,它需要是事务性的,因此添加注释事务性是有意义的。因此,如果存在级联,例如:当您删除一个人时,涉及多个需要使用注释 Transactional 进行事务处理的表
  • @Mr_Thorynque 我不确定你的意思?你能在Answer中举个例子吗?

标签: java spring spring-data crud transactional


【解决方案1】:

你不需要自己添加@Transactional注解。

来自https://spring.io/blog/2011/02/10/getting-started-with-spring-data-jpa/:

另外,我们可以去掉@Transactional注解 方法作为 Spring Data JPA 存储库的 CRUD 方法 实现已经用@Transactional注解了。

但是,如果您想按顺序执行一些只能一起执行或根本不执行的操作(这就是事务的用途),您应该在 DOA 中添加一个。

【讨论】:

  • 谢谢,参考你的回答:你能看看我的编辑吗,我不确定@transactional 在这种情况下是如何工作的?
  • tansactional annotation 如果上下文中没有事务,则打开一个事务,如果有,则什么都没有。
  • @Mr_Thorynque 在一般情况下并非如此。例如,如果您没有使用 JTA,并且您在另一个事务资源上有一个打开的事务。
  • @java123999 您的新代码将创建一个跨越两个删除操作的事务,假设“表是一个实体(名称非常混乱)并且大写是一种类型。@Transactional 将只有在没有从另一个带有 @Transactional 注释的方法中调用它时才打开一个新事务。
猜你喜欢
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-28
  • 2021-05-30
  • 2017-11-11
  • 2014-07-13
相关资源
最近更新 更多