2015-09-22 3 views
3

я следующий код:@Transactional распространение частных методов

@Service 
public class MyService implements IMyService { 
    @Inject 
    IAnotherService anotherService; 
    // injects go here 
    // some code 
    @Transactional(isolation=Isolation.SERIALIZABLE) 
    public Result myMethod() { 
     // stuff done here 
     return this.myPrivateMethod() 
    } 

    private Result myPrivateMethod() { 
     // stuff done here 
     // multiple DAO SAVE of anObject 
     anotherService.processSomething(anObject); 
     return result; 
    } 
} 

@Service 
public class AnotherService implements IAnotherService { 
     // injections here 
     // other stuff 

     @Transactional(isolation=SERIALIZABLE) 
     public Result processSomething(Object anObject) { 
     // some code here 
     // multiple dao save 
     // manipulation of anObject 
     dao.save(anObject); 
     } 
} 
  1. распространяется ли @Transactional поведение myPrivateMethod даже если это частный ?.
  2. Если Runtime Exception происходит на processSomething() и processSomething вызывается из myPrivateMethod, будет myPrivateMethod и myMethod сделать откат ?.
  3. Если ответ на 1 и 2 нет, как я могу достичь этого, не создавая другого @Service?. Как я могу выполнить метод извлечения и вызывать несколько частных методов внутри метода общедоступной службы в контексте @Transactional ?.
  4. Есть isolation=Isolation.SERIALIZABLE опция хорошая альтернатива synchronized методам ?.

Я знаю, что на это уже был дан ответ, но у меня все еще есть сомнения.

+0

Каковы ответы, которые вы нашли до сих пор? 1. yes 2. yes 3. неприменимо, поскольку 1 && 2 4. нет, поскольку он работает только в том случае, если метод вызывается внутри контейнера транзакции. –

+0

http://stackoverflow.com/questions/4396284/does-spring-transactional-attribute-work-on-a-private-method ---> Найдены некоторые ссылки, которые частично отвечают на мои вопросы, но основная тема не сосредоточена на тот же случай, который у меня есть. Я действительно должен был быть уверен, что транзакционная аннотация действительно работает в моем случае. На вопрос 4: И если я заставляю Распространение. ОБЯЗАТЕЛЬНО? – dantebarba

ответ

3
  1. Если myPrivateMethod вызывается из общедоступного метода, который является аннотированным @Transactional, он распространяется.
  2. Если первое условие имеет значение ИСТИНА, оно будет откатываться назад.
  3. Неправильное представление об уровне изоляции базы данных и синхронизации метода класса. Их вообще не следует сравнивать. Если ваш метод будет использоваться в многопоточном env, вы должны синхронизировать метод (помните, что в некоторых случаях недостаточно иметь потокобезопасный код). Уровень изоляции SERIALIZABLE используется на уровне базы данных. Это самый ограничительный уровень изоляции, и он может блокировать множество таблиц при выполнении некоторого запроса, прежде чем он будет сделан, чтобы ваши данные не переходили в какое-то несогласованное состояние. Вы должны быть уверены, что вам нужен этот уровень изоляции, потому что это может привести к проблемам с производительностью. Поэтому ответ НЕТ.