【问题标题】:Annotation with Transactional of CrudRepository's methodsCrudRepository 方法的 Transactional 注释
【发布时间】:2020-03-29 02:37:27
【问题描述】:
interface EntityRepository : CrudRepository<Entity, String> {

    @Transactional
    fun deleteById(id: String)
}

你好,

这里单SQL statement注解有什么意义呢?毕竟,AFAIK,从RDBMS 的角度来看,单个语句是事务。那么,注释的目的是什么?

【问题讨论】:

    标签: hibernate spring-boot kotlin


    【解决方案1】:

    基础仓库用@Transactional(readOnly = true)注解

    来自文档:

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

    你必须用@Transactional注释修改查询

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

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

    【讨论】:

      【解决方案2】:

      AFAIK,如果你关闭自动提交(你 should 尤其是更新、删除或插入),你必须明确声明何时开始和提交事务。在方法上注解@Transactional 允许您以声明方式进行(即事务在运行该方法之前开始,并在方法成功返回后提交)

      我相信如果更改仍然可以应用于数据库而无需使用 @Transactional 进行注释,很可能自动提交已打开。

      换句话说,如果关闭自动提交并且方法没有使用@Transactional注解,则方法内部所做的更改不会对数据库生效,因为该事务尚未提交。

      【讨论】:

        猜你喜欢
        • 2018-02-23
        • 2012-08-25
        • 2011-09-07
        • 2019-11-18
        • 2014-12-25
        • 2021-04-25
        • 2014-11-05
        • 2018-10-22
        • 2020-02-14
        相关资源
        最近更新 更多