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