当前位置: 首页 > 面试题库 >

在Spring中,我们是否需要@Transactional和@Modifying批注?

晋功
2023-03-14
问题内容

我仍在尝试围绕@Transactional的工作原理。

@Transactional在Service类的方法上有注释,而@Modifying在Repository类中的方法上有注释。带@Transactional注释的方法是否适用于带注释的存储库中的方法@Modifying

我的理解:

@Transactional@Transactional( readOnly = true )没有数据的类的方法上,将数据写入数据库,而使用时@Transactional,则将数据写入数据库。

修改查询

  1. 修改方法签名只能返回voidInteger或者int
  2. 更新查询必须是事务性的,标记为@Transactional
  3. Spring
    Data将删除所有未刷新的未处理更改EntityManager,更改为@Modifying(clearAutomatically=false)


第二点说@Modifying查询必须具有@Transactional(readOnly=false),因此我们可以在@Service方法调用@Repository级别或方法级别调用中添加查询。如果在@Service级别上添加,它也适用于@Respository@Service级别方法调用中调用的方法?

例:

@Service
class AnimalServiceImpl implements AnimalService {

@Autowire
AnimalRepository animalRepository;

@Override
@Transactional
public void persistAnimal() {
....
animalRepository.save();
}

@Override
@Transactional(readOnly = true)
public void checkIfAnimalPresent() {

...
animalRepository.checkIfPresent();

}

@Override
@Transactional
public void deleteAnimal() {
...
animalRepository.deleteAnimal();
}
}

资料库

@Repository
@Transactional(readOnly=true)
public interface AnimalRepository extends org.springframework.data.repository.Repository {

@Modifying
@Query(...)
void save();

@Modifying
@Query(...)
int checkIfPresent()

@Modifing
@Query(..)
int deleteAnimal();
}

我的问题是:

  1. @Transactional当我们在存储库@Repository级别拥有服务类并且我拥有@Modifying修改实体并将其写入数据库的方法时,为什么需要服务类(仅因为我@Transactional(readOnly = true)在类级别拥有)?
  2. @TransactionalService类上的注释是否会推广到@Repository类?

我希望我对这里的问题和例子很清楚。


问题答案:

这是如何@Transactional工作的:

默认情况下,存储库实例上的CRUD方法是事务性的。
对于读取操作,事务配置readOnly标志设置为true
所有其他文件均配置为普通格式,@Transactional以便应用默认事务配置。
如果需要调整存储库中声明的方法之一的事务配置,则可以覆盖该方法并添加@Transactional具有必需属性值的注释。

更改事务行为的另一种方法是使用外观或服务实现(通常)覆盖多个存储库。
其目的是为非CRUD操作定义事务边界。

如果使用这种方法,则存储库中的事务配置将被忽略,因为外部事务(在服务层中定义)配置决定了实际使用的事务。

参考:Spring Data JPA-参考文档-5.7。交易性



 类似资料:
  • 问题内容: 昨天,当我回答使用迭代器并删除时出现ConcurrentModificationException错误的问题时,我添加了一条通知 当您有ArrayLists时,使用迭代器不是一个好主意。 您无需深刻理解该问题即可回答该问题。 在那里,我有两条评论是我错了。 我的论点: 迭代器不易读取代码。 有可能引发难以调试的ConcurrentModificationException。 你能解释一

  • 我正在使用mockito作为junit。在创建对象的模拟时,我有疑问。我有一个名为DBConnect的类。我需要数据库属性,如dbname、凭据等。PatientDetails使用这个类。现在,当我为PatientDetails编写junit时。所以我使用以下代码。 用这个我不能得到正确的结果。

  • 问题内容: 我知道从同一个类内部调用事务方法时,它不会在事务中运行。Spring为事务方法创建代理,并将它们包装在try- catch块中,如果发生异常,则回滚。请考虑以下情形: 假设已从另一个对象调用,并且中发生了异常,因此成功完成但未成功。据我所知,尽管并且不是事务性的(因为它们是从同一个对象中调用的),但由于它是事务性的,因此仍应回滚。 我不明白的是,为什么人们说自我调用会破坏交易?只要调用

  • 我阅读了一些文章,发现:默认情况下,预启用了以下HttpMessageConverters实例: ByteArrayHttpMessageConverter-转换字节数组 StringHttpMessageConverter-转换字符串 ResourceHttpMessageConverter-转换org.springframework.core.io.resource用于任何类型的八位组流 So

  • 问题内容: 我有一个非常简单的文件: 而且有效。 但是,当我删除元素时,应用程序看不到实体(所有类都带有注释)。 是否有自动扫描类的机制? 问题答案: 你可以使用 该文件定义了一个名为的持久性单元,它使用JTA感知数据源。所述和元素指定管持久类:实体类,可嵌入类和超类映射。该元素指定JAR文件都包含持久化类管理的打包持久单元可见,而该class元素明确命名持久化类管理。 对于,也可以进行设置和配置

  • 问题内容: 我想在我的JavaScript代码中包含几个JSON文件,这些文件与JavaScript源文件位于同一目录中。 如果我想包含另一个JavaScript文件,可以直接使用。现在,我正在使用和获取JSON,我认为这是执行此操作的丑陋方法。 是否有类似的要求,使我能够加载JSON文件? 问题答案: 从节点v0.5.x开始,是的,您可以像需要js文件一样要求JSON。 在ES6中: