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

StackOverflow https://stackoverflow.com//questions/25076718

Вопрос

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

Однако мне было интересно, есть ли какие-либо хорошо известные примеры из реального мира, которые более подробно описывают каждое из этих свойств с точки зрения непрофессионала?

Это было полезно?

Решение

ТРЕБУЕМОЕ РАСПРОСТРАНЕНИЕ

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

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

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

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

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

РАЗМНОЖЕНИЕ_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 как полностью независимые транзакции и, следовательно, две независимые фиксации.

РАЗМНОЖЕНИЕ ПРОВЕРЕНО

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

ВЛОЖЕННЫЙ можно использовать только в том случае, если ваш драйвер JDBC и / или база данных поддерживают Точки сохранения JDBC

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top