@Transactional (поширення = розповсюдження.REQUIRED)


107

якщо хтось може пояснити, що робить це анотація і коли саме ми його використовуємо:

@Transactional(propagation=Propagation.REQUIRED)

Дякую



3
Propagation.REQUIRED - це режим розповсюдження за замовчуванням транзакції, тому не потрібно чітко встановлювати його.
tibtof

Відповіді:


65

Коли параметр розповсюдження є PROPAGATION_REQUIRED, для кожного методу, за допомогою якого застосовується налаштування, створюється логічна область транзакцій. Кожна така логічна область транзакцій може визначати статус лише відкату окремо, при цьому зовнішня область транзакцій є логічно незалежною від внутрішньої області транзакцій. Звичайно, у випадку стандартної поведінки PROPAGATION_REQUIRED, всі ці сфери дії будуть відображені в одній фізичній транзакції. Таким чином, маркер, призначений лише для відкату, встановлений у внутрішній області транзакцій, впливає на шанс зовнішньої транзакції фактично здійснити (як ви цього очікували).

введіть тут опис зображення

http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html


166

Якщо вам потрібно пояснити використання лайманс, що виходить за рамки, передбачені у Весняних документах

Розглянемо цей код ...

class Service {
    @Transactional(propagation=Propagation.REQUIRED)
    public void doSomething() {
        // access a database using a DAO
    }
}

Коли називається doSomething (), він знає, що він повинен запустити транзакцію в базі даних перед виконанням. Якщо абонент цього методу вже запустив транзакцію, то цей метод буде використовувати ту саму фізичну транзакцію у поточному підключенні до бази даних.

Це @Transactionalанотація забезпечує засіб повідомляти про ваш код під час його виконання, що він повинен мати транзакцію. Він не запуститься без одного, тому ви можете зробити таке припущення у своєму коді, що у вашій базі даних не залишиться неповних даних, або доведеться щось очистити, якщо трапляється виняток.

Управління транзакціями є досить складною темою, тому, сподіваємось, ця спрощена відповідь корисна



якщо він використовує конфігурацію на основі проксі для декларування та доступу до шару DAO, метод у клас DAO повинен бути також анотований разом із @Transactional.
Курапіка

Якщо ви додали @Transactionalдо свого сервісного рівня, більше не потрібно додавати @Transactionalдо методів DAO, що викликаються в рамках цієї транзакції.
Бред

якщо doSomething()викликає інший вкладений метод без будь-якого @transactional, чи буде ця сама транзакція застосовуватися і до цього методу виклику?
цейараттр

Так, до тих пір, поки та сама Тема використовується для виконання вкладеного методу (тобто ви не створюєте нову Тему явно). Це тому, що весняні транзакції пов'язані з поточною темою за допомогою змінних ThreadLocal
Бред

15

Якщо у весняних додатках увімкнено підтримку транзакцій на основі анотацій, використовуючи <tx:annotation-driven/>та коментуючи будь-який клас / метод за допомогою @Transactional (propagation = Propagation.REQUIRED), тоді Spring Framework розпочне транзакцію та виконає метод та здійснить транзакцію. Якщо сталася будь-яка програма RuntimeException, транзакція буде повернута назад.

Насправді розповсюдження = розповсюдження.REQUIRED - це рівень поширення за замовчуванням, вам не потрібно чітко згадувати про це.

Для отримання додаткової інформації: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html#transaction-declarative-annotations


5

Щоб зрозуміти різні настройки транзакцій та поведінку, прийняті для управління транзакціями, наприклад REQUIRED, ISOLATIONтощо, вам доведеться зрозуміти основи самого управління транзакціями.

Докладніше про пояснення читайте в службі управління Trasaction .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.