例如,我有两个存储库方法,如
@Query("select * from person where name = ?1", nativeQuery = true)
Person findPersonByName(String name);
@Modifying
@Query("delete from person where id = ?1", nativeQuery = true)
int deletePersonById(Long id);
在这里,第一个方法工作正常,返回一个实体person。
但是第二个方法抛出TransactionRequiredException
。
根据文档,CrudRepository
方法默认是事务性的。
我从这个声明中理解到,Repository
和CrudRepository
的那些方法在实现存储库的代理类中被标记为@Transactional
,并且定制查询方法不是事务性的。
如果是这样的话,我的第一个方法不需要事务性注解吗?没有事务性,它是如何工作的?
为什么第二种方法只有在包含事务注解时才有效?
我试着在第二个方法上添加事务注解,效果很好。
但是为什么第一个方法不需要这个注解,为什么第一个方法即使没有显式应用事务注解也能工作?
1条答案
按热度按时间daupos2t1#
这可以归结为
EntityManager
的规范,它基本上需要一个事务来执行写操作(merge
、persist
、delete
),而不需要一个事务来执行阅读操作。