Spring Transaction:如果我不在方法上给出@Transaction 注释会发生啥

Posted

技术标签:

【中文标题】Spring Transaction:如果我不在方法上给出@Transaction 注释会发生啥【英文标题】:Spring Transaction: What will happen if I don't give @Transaction annotation on methodSpring Transaction:如果我不在方法上给出@Transaction 注释会发生什么 【发布时间】:2017-01-23 20:45:31 【问题描述】:

我正在使用 Spring-Boot、Spring Rest Controller 和 Spring Data JPA。如果我不指定@Transaction,那么还记录get的创建,但我想了解它是如何发生的。我的理解是Spring默认添加一个带有默认参数的事务,但不确定它添加到哪里是添加服务层还是在存储库.

 public interface CustomerRepository extends CrudRepository<Customer, Long> 

    List<Customer> findByLastName(String lastName);
 

 @Service
 public class CustomerServiceImpl implements CustomerService> 

   List<Customer> findByLastName(String lastName)
     //read operation
    

 // What will happen if @Transaction is missing. How record get's created without the annotation
  public Customer insert(Customer customer)
  // insert operations
   
 

【问题讨论】:

投了票,因为我有同样的问题,需要很长时间才能找到答案。 恕我直言,Spring 不应该添加任何 tx 行为。使用传统 RDBMS 会得到“自动提交”执行模式,其中每个 SQL 语句都在其自己的单独事务中执行。 【参考方案1】:

Spring Data JPA 在 Repository 层添加了 @Transactional 注释,特别是在 SimpleJpaRepository 类中。这是为所有 Spring Data JPA 存储库扩展的基础 Repository 类

例如

/*
     * (non-Javadoc)
     * @see org.springframework.data.repository.CrudRepository#save(java.lang.Object)
     */
    @Transactional
    public <S extends T> S save(S entity) 

        if (entityInformation.isNew(entity)) 
            em.persist(entity);
            return entity;
         else 
            return em.merge(entity);
        
    

【讨论】:

【参考方案2】:

虽然 Spring 在 DAO 层自动添加了@Transactional 注解,但这不是正确的地方,也不是正确的行为。注解必须位于服务层,有回答问题here。

【讨论】:

以上是关于Spring Transaction:如果我不在方法上给出@Transaction 注释会发生啥的主要内容,如果未能解决你的问题,请参考以下文章

spring transaction注解原理

SpringMVC中的@Transaction怎么使用,有啥作用

Spring-事务管理(Transaction)

Spring Transaction属性之Propagation

Spring Boot Stomp-Transaction Sockjs: ERROR message=[Bad transaction] Invalid transaction identifier

Hibernate 4 + Spring 3.2 + Transaction:一个服务,几个道,一个方法