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 注释会发生啥的主要内容,如果未能解决你的问题,请参考以下文章
SpringMVC中的@Transaction怎么使用,有啥作用
Spring Transaction属性之Propagation
Spring Boot Stomp-Transaction Sockjs: ERROR message=[Bad transaction] Invalid transaction identifier