为什么没有@Transactional 我可以保存?

sp0*_*00m 7 java mysql hibernate spring-data-jpa spring-boot

简化示例:

@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);
  }

}
Run Code Online (Sandbox Code Playgroud)

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

额外细节:

  • 爪哇 9
  • MySQL 连接器 6.0.6
  • 休眠 5.2.12
  • 春季启动 2.0.0.M7
  • Spring Data JPA 2.0.2.RELEASE

Syn*_*ync 6

CrudRepository#saveSpring 提供的实现默认创建一个事务。有关更多详细信息,请参阅文档