【问题标题】:Why Update using @Query in Spring Data Jpa requires @Transactional为什么在 Spring Data Jpa 中使用 @Query 进行更新需要 @Transactional
【发布时间】:2022-10-16 05:42:48
【问题描述】:

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

【问题讨论】:

  • 不。您不想要自动提交,谁说更新是唯一正在执行的操作?实际的 tx 边界应该是您的服务不是你的存储库。
  • 对不起,我不明白你的意思。我对此有点陌生。当我在 SQL 终端中执行更新查询时。我不使用事务进行更新查询,但在 Spring Boot JPA 的情况下,我无法在没有事务的情况下运行它。你能建议一些关于这个的链接或帖子吗?
  • 您仍在使用交易,但您不知道。你不能在没有事务的情况下修改(插入、更新、删除)数据库中的东西。您要么有一个隐式(自动提交)或显式事务。您不希望自动提交,因为这可能导致完成 10 次单独的提交,而这些提交应该是一个单独的。

标签: spring-boot spring-data-jpa transactions updates


【解决方案1】:

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 中,自动提交现在只是写查询的运行时验证。

【讨论】:

    猜你喜欢
    • 2021-12-22
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 2021-01-02
    • 2013-06-11
    • 2022-12-05
    相关资源
    最近更新 更多