CrudRepository方法的事务注释

时间:2019-12-04 10:10:59

标签: hibernate spring-boot kotlin

interface EntityRepository : CrudRepository<Entity, String> {

    @Transactional
    fun deleteById(id: String)
}

你好

这里的单个SQL statement的注释点是什么?毕竟,从RDBMS角度来看,AFAIK单个语句就是事务。因此,注释的目的是什么?

2 个答案:

答案 0 :(得分:0)

基础存储库带有@Transactional(readOnly = true)

注释

从文档中

  

您可以将事务用于只读查询并将其标记为   通过设置readOnly标志。但是,这样做不会起到   检查您是否不触发操作查询(尽管有些   数据库拒绝只读内部的INSERT和UPDATE语句   交易)。相反,将readOnly标志作为提示传播给   用于性能优化的底层JDBC驱动程序。此外,   Spring对基础JPA提供程序进行了一些优化。对于   例如,当与Hibernate一起使用时,刷新模式在以下情况下设置为NEVER:   您将事务配置为readOnly,这将导致Hibernate   跳过脏检查(大对象树的显着改进)。

您必须在其中加上@Transactional修饰查询的注释

请在文档中找到更多信息:

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#transactions

答案 1 :(得分:0)

AFAIK,如果您关闭了自动提交(should,尤其是对于update,delete或insert),则必须明确声明何时开始和提交事务。在方法上加上注释@Transactional可以使您以声明方式进行操作(即,事务在运行该方法之前开始,并在该方法成功返回之后进行提交)

我相信,如果仍然可以在不使用@Transactional注释的情况下将更改应用于数据库,则很有可能已启用自动提交。

换句话说,如果关闭了自动提交并且未用@Transactional注释方法,则由于尚未提交事务,因此在方法内部进行的更改将对数据库无效。