2015-04-03 2 views
2

В нашем коде есть следующий метод, который содержит аннотацию Transactional и синхронизирован.Синхронный метод транзакции весной

@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class) 
public synchronized void addValueToDB(String value, int parent) { 
    int nextId = getNextIDUsingSequence(); 
    insertIntoDB(nextId, value); 
    updateLeft(parent); 
    updateRight(parent); 
} 

Теперь, как Transactional аннотацию совершает в базе данных после завершения метода так синхронизации на этот метод кажется бесполезным для меня? Имеет ли весна какое-либо решение для этого или я должен синхронизировать блок, из которого вызывается этот метод?

+0

ли вы решить вашу проблему? Можете ли вы поделиться своим решением? Благодарю. –

+0

@PedroPedruzzi Что мы сделали, мы синхронизировали блок в сервисе, откуда этот метод вызывался. –

ответ

0

вместо того, чтобы сделать метод getNextIdUSingSequnence синхронизированным. Транзакционная аннотация позаботится о методе addValueToDb.

2

операция и синхронизация две разных вещи:

  1. ТЙ (транзакция) означает, что ваш код не будет видеть эффекты других передатчиков работают alongsde его (до точки ...), но не предотвратит запуск других TX. например, вы можете попробовать и изменить одну и ту же строку базы данных из 2 TX. один (1-й для фиксации) будет успешным, а другой потерпит неудачу.

  2. синхронизация предотвращает одновременное выполнение несколькими потоками выполнения вашего метода (в том же экземпляре вашего класса. Является вашим классом singleton?). он предлагает гораздо более мощную изоляцию

Вы должны решить, какой из 2 вам нужно

+0

это 2 разные вещи, но нам нужны оба. Итак, вопрос в том, где должна быть синхронизация? (или весна дает какое-либо решение?) –

Смежные вопросы