1

В моем приложении у меня есть несколько комментариев @Transactional о разных методах.Несколько аннотаций Spring @Transactional в одном приложении?

Используют Crud Repository для удаления в моей базе данных. Мне интересно на , на каком этапе эти удаления выполняются, и мне нужны все аннотации @Transactional?

Например, 2 удалить methods, которые позже названный в façade method, метод фасад затем вызывается в runner:

1. Метод 1:

@Transactional 
public void deleteFromSchemaOne(){ 

} 

1. Способ 2:

@Transactional 
public void deleteFromSchemaTwo(){ 

} 

2. Вызов этих 2 методов в методе фасада:

@Transacational 
public void deleteFromAllSchemas(){ 

deleteFromSchemaOne(); 
deleteFromSchemaTwo(); 

} 

3. Вызывать метод фасада в бегуна

@Transactional 
    public void run(String... args) throws Exception { 

     service.deleteFromAllSchemas(); 


} 

То, что я хотел бы знать:

На какой стадии будут удалены мои ? Будет ли это, когда метод будет завершен в Runner?

РЕДАКТИРОВАТЬ:

метод Фасад с петлей:

public void deleteFromAllSchemas() { 

    for(int i = 0; i < list.size(); i++){ 

    deleteFromSchemaOne(); 
    deleteFromSchemaTwo(); 

    } 

}

ответ

3

После завершения транзакции внешний, так что после 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); 
} 
+0

В основном то, что я хочу сделать, это убедиться, что метод deleteFromAllSchemas() является transactional- то есть все, что в схеме один и два сусло удаляться или вообще ничего, как я могу это сделать? Спасибо за вашу помощь. – java123999

+1

Это выполняется с помощью '@ Transactional' в' deleteFromAllSchemas() '.Если произошла ошибка, она откатит все изменения, сделанные в 'deleteFromSchemaOne()' и 'deleteFromSchemaTwo()'. Вы должны действительно читать транзакции. Они не то, что вы можете просто надеяться получить право или «учиться на работе». – Kayaman

+1

Это правильно. Я хотел бы добавить, что в целом транзакции должны быть как можно короче. Поэтому, если эти удаленные базы данных не зависят друг от друга (допустим, если кто-то не работает, вам нужно отменить всю транзакцию), вы должны аннотировать только два метода удаления. Это гарантирует, что каждое удаление будет выполняться в отдельной транзакции. Если они зависят друг от друга. Аннотируйте метод, который их вызывает, и, возможно, аннотируют методы удаления с помощью '@Transactional (распространение = распространение). –