interface EntityRepository : CrudRepository<Entity, String> {
@Transactional
fun deleteById(id: String)
}
你好
这里的单个SQL statement
的注释点是什么?毕竟,从RDBMS
角度来看,AFAIK单个语句就是事务。因此,注释的目的是什么?
答案 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
注释方法,则由于尚未提交事务,因此在方法内部进行的更改将对数据库无效。