CrudRepository方法的事务性注释


interface EntityRepository : CrudRepository<Entity, String> {
@Transactional
fun deleteById(id: String)
}

你好

这里注释单个SQL statement的意义何在?毕竟,从RDBMS的角度来看,AFAIK,单个语句是交易。因此,注释的目的是什么?

基本存储库用@Transactional(readOnly = true)注释

从文档中:

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

在那里,您必须用@Transactional注释修改查询

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

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

> AFAIK ,如果你关闭自动提交(你应该特别更新,删除或插入(,你必须明确声明何时启动和提交事务。对方法进行@Transactional注释允许您以声明方式执行此操作(即事务在运行该方法之前启动,并在方法成功返回后提交(

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

换句话说,如果关闭了自动提交并且一个方法没有用@Transactional注释,那么在方法内部所做的更改将不会对数据库生效,因为事务尚未提交。

最新更新