一个应用程序中有多个 Spring @Transactional 注释?
Multiple Spring @Transactional annotations in one application?
在我的应用程序中,我对不同的方法有几个 @Transactional
注释。
他们使用 Crud Repository
对我的数据库进行删除。我想知道在 什么阶段 执行这些删除,我是否需要所有 @Transactional
注释?
例如2 delete methods
后面在a façade method
中调用,然后在runner
中调用façade方法:
1.方法一:
@Transactional
public void deleteFromSchemaOne(){
}
1.方法二:
@Transactional
public void deleteFromSchemaTwo(){
}
2。在外观方法中调用这 2 个方法:
@Transacational
public void deleteFromAllSchemas(){
deleteFromSchemaOne();
deleteFromSchemaTwo();
}
3。在runner中调用façade方法
@Transactional
public void run(String... args) throws Exception {
service.deleteFromAllSchemas();
}
我想知道的是:
我的删除实际上执行的哪个阶段?会不会是方法在Runner里面完成的时候?
编辑:
带循环的外观方法:
public void deleteFromAllSchemas() {
for(int i = 0; i < list.size(); i++){
deleteFromSchemaOne();
deleteFromSchemaTwo();
}
}
当最外层事务完成时,所以在 run()
之后。
实际上它不是最外层的,它是唯一的交易。内部 @Transactionals
不创建新交易,它们只是加入现有交易。
如果您需要确保某些更改甚至在外部事务完成之前就已提交,则需要使用 @Transactional(propagation=Propagation.REQUIRES_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);
}
在我的应用程序中,我对不同的方法有几个 @Transactional
注释。
他们使用 Crud Repository
对我的数据库进行删除。我想知道在 什么阶段 执行这些删除,我是否需要所有 @Transactional
注释?
例如2 delete methods
后面在a façade method
中调用,然后在runner
中调用façade方法:
1.方法一:
@Transactional
public void deleteFromSchemaOne(){
}
1.方法二:
@Transactional
public void deleteFromSchemaTwo(){
}
2。在外观方法中调用这 2 个方法:
@Transacational
public void deleteFromAllSchemas(){
deleteFromSchemaOne();
deleteFromSchemaTwo();
}
3。在runner中调用façade方法
@Transactional
public void run(String... args) throws Exception {
service.deleteFromAllSchemas();
}
我想知道的是:
我的删除实际上执行的哪个阶段?会不会是方法在Runner里面完成的时候?
编辑:
带循环的外观方法:
public void deleteFromAllSchemas() {
for(int i = 0; i < list.size(); i++){
deleteFromSchemaOne();
deleteFromSchemaTwo();
}
}
当最外层事务完成时,所以在 run()
之后。
实际上它不是最外层的,它是唯一的交易。内部 @Transactionals
不创建新交易,它们只是加入现有交易。
如果您需要确保某些更改甚至在外部事务完成之前就已提交,则需要使用 @Transactional(propagation=Propagation.REQUIRES_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);
}