Spring данные JPA и управление транзакциями - PullRequest
0 голосов
/ 20 сентября 2018

В моем сервисе Spring я вызываю два метода репозитория данных Spring

@Service
public class ClientService {
    public void updateClientByIdAndKey(final Integer id, final String key) {
        final Client client = clientRepository.findByIdAndKey(id, key);
        // .. Update client details
        client.save(client);
   }
}

Теперь мой запрос связан с управлением транзакциями.Насколько я понимаю и видел код, в весенних репозиториях разрешены транзакции с использованием @Transactional для его методов.Для операций выбора он имеет readonly = true.

Мое понимание транзакции состоит в том, что, когда операция выбора выполняется, создается транзакция, а затем для операции сохранения создается другая транзакция, поскольку для операции выбора транзакция readOnly =правда.

Я хотел, чтобы операции чтения и записи выполнялись в одной транзакции.Если мое понимание выше верное, тогда наличие @ Transactional над методом обслуживания updateClientByIdAndKey будет запускать обе в одной транзакции, что является моим намерением, или будет выполнять обе операции в одной транзакции?

Пожалуйста, дайте мне знать, если я что-то здесь упускаю.

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

Когда вы добавляете аннотацию @Transactional к своему методу updateClientByIdAndKey, Spring создаст только одну транзакцию чтения-записи (если вы не добавите дополнительную аннотацию @Transactional к своему методу findByIdAndKey/save с помощью PROPAGATION_REQUIRES_NEW или другого типа распространение . При добавлении readOnly = true к @Transactional пружина установит flushMode, в сеансе Hibernate будет установлено значение NEVER. Это означает, что вы не можете выполнять какие-либо операции создания, обновления и удаления.

0 голосов
/ 20 сентября 2018

метод findByIdAndKey не требует выполнения COMMIT (хранить изменения в базе данных) и должен быть аннотирован как

@Transactional(readOnly = true)

метод updateClientByIdAndKey должен использовать

@Transactional

in updateClientByIdAndKey используется только одна транзакция чтения-записи, если только ваш вложенный метод findByIdAndKey не определяет

@Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)

В этом случае выявное создание новой (только для чтения) транзакции, которая не имеет смысла.

0 голосов
/ 20 сентября 2018

Свойство ReadOnly @Transactional по умолчанию имеет значение false.Просто аннотируя метод с помощью Transactional, операция чтения / выбора и операция обновления будут выполняться в одной транзакции.Если вы измените свойство на true, я предполагаю, что у вас не будет двух транзакций, но вместо этого при попытке обновления будет сгенерировано исключение.

РЕДАКТИРОВАТЬ: если метод не аннотирован Transactional, обе операции будутне выполнить в одной транзакции.На самом деле, в зависимости от того, как вы настроили ORM, может возникнуть исключение при выполнении обновления, поскольку соединение будет закрыто после выбора.

...