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



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

SQL 中有两种执行事务的方式

隐式->这意味着数据库在运行写查询(UPDATE、INSERT…(时,创建一个隔离,然后执行。如果发生错误,将放弃隔离,并且不会写入任何更改。

显式->在这篇文章中,您使用BEGIN显式指定隔离开始,由ROLLBACK丢弃,最后由COMMIT写入

postgres(<7.4(的初始版本有一个名为AUTOCOMMIT的配置,当它被设置时,将禁用隐式事务。但这在2003年被禁用,因为数据库足够智能,可以丢弃隔离,不会造成不一致。

简而言之,在任何时候运行以下查询

UPDATE table_name WHERE id IN (....)

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

完全相同。

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

相关内容

  • 没有找到相关文章

最新更新