spring-data-jpa 为什么在Spring Data Jpa中使用@Query进行更新需要@Transactional

uklbhaso  于 2022-11-10  发布在  Spring
关注(0)|答案(1)|浏览(152)

我是spring Boot 的新手。我使用spring data jpa来处理数据库。我有一个使用@Query来更新数据库中的表的方法。但是当我尝试更新时,我得到了一个invalidDataAccessApiUsageException异常。当我尝试使用@Transactional时,它成功更新。不是更新一个操作,所以它不会自动提交。

ifmq2ha2

ifmq2ha21#

在SQL中有两种执行事务的方式
隐式-〉表示数据库在运行写查询(UPDATE,INSERT....)时,创建一个隔离,然后执行。如果发生错误,则放弃隔离,并且不写入任何更改。
Explicit -〉在这里,您使用开始显式指定隔离开始,通过ROLLBACK进行丢弃,最后通过COMMIT进行写入
postgres的初始版本(〈7.4)有一个名为AUTOCOMMIT的配置,当它关闭时,将禁用隐式事务。但这在2003年被禁用,因为数据库足够智能,可以放弃隔离,不会产生不一致。
简单地说,在任何时候运行以下查询

UPDATE table_name WHERE id IN (....)

BEGIN
UPDATE table_name WHERE id IN (....)
COMMIT

是完全一样的。
在JPA中,自动提交现在只是写查询的运行时验证。

相关问题