Spring Примеры распространения в непрофессионалах

Документы Spring делают фантастическую работу по описанию свойств распространения транзакций.

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

Ответ 1

PROPAGATION_REQUIRED

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

Когда вызывается doSomething(), он запустит новую транзакцию, если вызывающий абонент еще не запустил транзакцию.

Если вызывающий объект этого метода уже начал транзакцию, транзакция вызывающих используется и не создается новая транзакция (т.е. в игре есть одна транзакция).

Если в doSomething() выбрано исключение, оно будет отброшено назад, что означает, что вызывающий элемент также увидит, что транзакция откат.

Когда doSomething() возвращает транзакцию, она еще не была совершена. Это вызывающий объект, который совершит транзакцию (или, возможно, откат).

PROPAGATION_REQUIRES_NEW

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

Когда вызывается doSomething(), он всегда запускает новую транзакцию.

Если вызывающий объект этого метода уже начал транзакцию (TxnOuter), транзакция вызывающих абонентов приостанавливается и создается новая транзакция (TxnInner) (т.е. в игре есть две транзакции).

Если исключение выбрано внутри doSomething(), то TxnInner будет откат, но приостановленная транзакция от вызывающего (TxnOuter) не будет затронута.

Когда doSomething() возвращается без исключения, он совершит транзакцию (TxnInner). Транзакция вызывающего абонента (TxnOuter) будет возобновлена ​​и не будет знать, что была совершена другая транзакция. Затем вызывающий абонент может совершать или откатывать TxnOuter по своему усмотрению.

Важно отметить, что база данных рассматривает TxnOuter и TxnInner как полностью независимые транзакции, и поэтому две независимые транзакции.

PROPAGATION_NESTED

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

NESTED может использоваться только в том случае, если ваш драйвер JDBC и/или база данных поддерживает точки сохранения JDBC

Когда вызывается doSomething(), он запустит новую транзакцию, если вызывающий абонент еще не запустил транзакцию.

Если вызывающий объект этого метода уже начал транзакцию, транзакция вызывающих используется и не создается новая транзакция (т.е. в игре есть одна транзакция). Однако при выполнении операции doSomething() в транзакции отмечается "точка сохранения".

Если в doSomething() выбрано исключение, транзакция может частично отбросить транзакцию в "точку сохранения". Вызывающая сторона продолжит транзакцию.

Когда doSomething() возвращается без исключения, это вызывающий, который совершит всю транзакцию (или откат).

Важно отметить, что в базе данных отображается только одна транзакция, и есть только одна фиксация.