Примеры весеннего распространения с точки зрения непрофессионала

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() возвращается без исключения, вызывающая сторона будет совершать всю транзакцию (или откатывать).

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

Другие вопросы по тегам