Spring:: Если разветвляется новый поток, он будет принудительно применен в транзакции Spring

Мы используем декларативный атрибут транзакции spring для обеспечения целостности базы данных. Некоторые из нашего кода вызывают веб-службу, которая делает кучу вещей в sharepoint. Проблема в том, что когда веб-сервисы занимают больше времени, пользователи получают тупик из-за весны, которая задерживает серверную часть.

Если я создам новый поток внутри функции с декларативным атрибутом транзакции Spring, будет ли он проигнорирован из Spring?

[Transaction(TransactionPropagation.Required, ReadOnly = false)]
    public void UploadPDFManual(/*parameters*/)
    {
       //DO some data base related things

        if (revisionPDFBytes != null)
        {
          //my sharepoint call which calls webservice
           Task.Factory.StartNew(() => DocumentRepositoryUtil.CreateSharepointDocument(docInfo)); // I draw a new thread from ASPNET worker thread pool.
        }
    }

Какие-нибудь другие варианты, на которые я должен пойти?


person Community    schedule 10.04.2014    source источник


Ответы (1)


Вам не нужно делать это в транзакции. Транзакция заставляет базу данных правильно сохранять объект. Вот и все. Все остальные вещи должны быть сделаны после фиксации транзакции. В Java вы можете сделать это с помощью синхронизации транзакций Spring или JMS. Взгляните на принятый ответ здесь.

Дополнительная полезная информация для .NET (см. 17.8).

person Andrey Atapin    schedule 10.04.2014
comment
мне понравилась идея отделить то, что не должно быть в транзакции - person ; 10.04.2014