为啥没有@Transactional 我可以保存? [复制]

Posted

技术标签:

【中文标题】为啥没有@Transactional 我可以保存? [复制]【英文标题】:Why can I save without @Transactional? [duplicate]为什么没有@Transactional 我可以保存? [复制] 【发布时间】:2018-05-28 12:39:06 【问题描述】:

简化示例:

@Entity
public class Foo 

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Integer id;
  private String bar;

  // getters + setters



public interface FooRepository extends CrudRepository<Foo, Integer> 


@Service
public class FooService 

  private final FooRepository repository;

  public FooService(FooRepository repository) 
    this.repository = repository;
  

  public Foo save(Foo foo) 
    return repository.save(foo);
  


从控制器调用fooService.save(myNewFoo) 是可行的,但我预计它会失败(如果我正确理解事务),因为没有方法用@Transactional 注释(我实际上希望它失败)。知道为什么会出现这种行为吗?谁在现场创建交易,如何避免这种情况?

其他细节:

Java 9 mysql 连接器 6.0.6 休眠 5.2.12 Spring Boot 2.0.0.M7 Spring Data JPA 2.0.2.RELEASE

【问题讨论】:

默认CrudRepository和好友的方法是@Transactional @M.Deinum 有什么办法让他们不是@Transactional 那么?除了自己重写整个实现之外?我希望我的服务负责交易,否则失败。 @M.Deinum 也许我可以扩展SimpleJpaRepository 并以某种方式禁用@Transactions? 如何阅读发行说明...jira.spring.io/browse/DATAJPA-685 @M.Deinum 听起来不错。 【参考方案1】:

Spring提供的CrudRepository#save的实现默认创建一个事务。详情请见the documentation。

【讨论】:

以上是关于为啥没有@Transactional 我可以保存? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在没有事务的情况下如何将实体保存到数据库中?

为什么private方法加了@Transactional,事务也没有生效?

为啥将@Transactional 与@Service 一起使用而不是与@Controller 一起使用

为啥将@Transactional 与@Service 一起使用而不是与@Controller 一起使用

Spring @Transactional 方法中没有事务开始

尽管存在`@Transactional`,为啥这些数据库修改不回滚?