Java 在一个应用程序中有多个Spring@Transactional注释?
在我的应用程序中,我在不同的方法上有几个Java 在一个应用程序中有多个Spring@Transactional注释?,java,spring,database-connection,spring-annotations,transactional,Java,Spring,Database Connection,Spring Annotations,Transactional,在我的应用程序中,我在不同的方法上有几个@Transactional注释 他们使用Crud存储库对我的数据库执行删除。我想知道这些删除是在什么阶段执行的,我需要所有的@Transactional注释吗 例如,2个delete方法,随后在立面方法中调用,然后在运行程序中调用立面方法: 1。方法1: @Transactional public void deleteFromSchemaOne(){ } 1。方法2: @Transactional public void deleteFromSch
@Transactional
注释
他们使用Crud存储库
对我的数据库执行删除。我想知道这些删除是在什么阶段执行的,我需要所有的@Transactional
注释吗
例如,2个delete方法
,随后在立面方法
中调用,然后在运行程序
中调用立面方法:
1。方法1:
@Transactional
public void deleteFromSchemaOne(){
}
1。方法2:
@Transactional
public void deleteFromSchemaTwo(){
}
@Transacational
public void deleteFromAllSchemas(){
deleteFromSchemaOne();
deleteFromSchemaTwo();
}
public void deleteFromAllSchemas() {
for(int i = 0; i < list.size(); i++){
deleteFromSchemaOne();
deleteFromSchemaTwo();
}
2。在façade方法中调用这两个方法:
@Transactional
public void deleteFromSchemaTwo(){
}
@Transacational
public void deleteFromAllSchemas(){
deleteFromSchemaOne();
deleteFromSchemaTwo();
}
public void deleteFromAllSchemas() {
for(int i = 0; i < list.size(); i++){
deleteFromSchemaOne();
deleteFromSchemaTwo();
}
3。调用runner中的façade方法
@Transactional
public void run(String... args) throws Exception {
service.deleteFromAllSchemas();
}
我想知道的是:
我的删除将在哪个阶段执行?是否会在Runner中完成该方法
编辑:
带循环的立面方法:
@Transactional
public void deleteFromSchemaTwo(){
}
@Transacational
public void deleteFromAllSchemas(){
deleteFromSchemaOne();
deleteFromSchemaTwo();
}
public void deleteFromAllSchemas() {
for(int i = 0; i < list.size(); i++){
deleteFromSchemaOne();
deleteFromSchemaTwo();
}
public void deleteFromAllSchemas(){
对于(int i=0;i
}当最外面的事务完成时,所以在
运行()之后。
实际上这不是最外层的,这是唯一的交易。内部@Transactionals
不创建新事务,它们只是加入现有事务
如果需要确保在外部事务完成之前提交某些更改,则需要使用@Transactional(propagation=propagation.REQUIRES\u NEW)
设置事务的传播。这将创建一个新事务,即使已经存在一个事务
在您的示例代码中(至少基于它现在包含的内容),run()
方法甚至不应该启动事务
如果我没弄错的话,你想要的东西是
public void run() {
for(int i = 0;i < list.size(); i++)
service.deleteFromAllSchemas(i);
}
@Transactional
public void deleteFromAllSchemas(int i) {
deleteFromSchemaOne(i);
deleteFromSchemaTwo(i);
}
public void run(){
对于(int i=0;i
基本上,我想做的是确保deleteFromAllSchemas()方法是事务性的,即必须删除模式1和模式2中的所有内容,或者什么都不删除,我该怎么做?感谢您的帮助。这是通过deleteFromAllSchemas()
中的@Transactional
实现的。如果发生错误,它将回滚在deleteFromSchemaOne()
和deleteFromSchemaTwo()中所做的任何更改。你也应该认真阅读交易。它们不是你只希望做对或“在工作中学习”的东西。这是正确的。我想补充一点,一般来说,交易应该尽可能短。因此,除非这些数据库删除相互依赖(假设其中一个数据库删除失败,您可能希望回滚整个事务),否则您应该只注释这两个delete方法。这确保了每次删除都将在单独的事务中运行。如果他们彼此依赖。注释调用它们的方法,并可选地使用@Transactional(propagation=propagation.MANDATORY)
注释delete方法。谢谢,那么在什么情况下我需要运行程序上的@Transactional注释呢?@java123999太宽泛了,无法讨论。也许永远不会,也许在某些情况下取决于你的设计。