为啥没有@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
并以某种方式禁用@Transaction
s?
如何阅读发行说明...jira.spring.io/browse/DATAJPA-685
@M.Deinum 听起来不错。
【参考方案1】:
Spring提供的CrudRepository#save
的实现默认创建一个事务。详情请见the documentation。
【讨论】:
以上是关于为啥没有@Transactional 我可以保存? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为什么private方法加了@Transactional,事务也没有生效?
为啥将@Transactional 与@Service 一起使用而不是与@Controller 一起使用
为啥将@Transactional 与@Service 一起使用而不是与@Controller 一起使用