stefano/stefano-nested-transaction

Nested Transaction Manager

0.0.3 2014-01-23 20:27 UTC

README

Test Status Code Coverage Dependencies 68747470733a2f2f7365637572652e7472617669 Coverage Status Dependency Status

Instalation using Composer

  1. Add following line to your composer.json "stefano/stefano-nested-transaction": "*"

Features

  • manages nested transaction

Usage

  • Configuration
//$transactionAdapter implements \StefanoNestedTransaction\Adapter\TransactionInterface
$transactionAdapter = new YourTransactionAdapter();

$transactionManager = new \StefanoNestedTransaction\TransactionManager($transactionAdapter);
  • Example: normal flow
$transactionManager->begin(); //REAL start transaction
try {
    // ...

    //nested transaction block, that might be in some other code
    $transactionManager->begin(); //increase internal transaction counter
    try {
        // ...

        $transactionManager->commit(); //decrease internal transaction counter
    } catch(\Exception $e) {
        $transactionManager->rollback(); //skipped
        throw $e->getPrevious();
    }

    // ...
    $transactionManager->commit(); //REAL commit transaction;
} catch(\Exception $e) {
    $transactionManager->rollback(); //skipped
    throw $e->getPrevious();
}
  • Example: throw exception
$transactionManager->begin(); //REAL start transaction
try {
    // ...

    //nested transaction block, that might be in some other code
    $transactionManager->begin(); //increase internal transaction counter
    try {
        // ...

        throw new \Exception();

        $transactionManager->commit(); //skipped
    } catch(\Exception $e) {
        $transactionManager->rollback(); //marked as rollback only
        throw $e->getPrevious();
    }

    // ...
    $transactionManager->commit(); //skipped
} catch(\Exception $e) {
    $transactionManager->rollback(); //REAL rollback
    throw $e->getPrevious();
}
  • Example: throw exception
$transactionManager->begin(); //REAL start transaction
try {
    // ...

    //nested transaction block, that might be in some other code
    $transactionManager->begin(); //increase internal transaction counter
    try {
        // ...

        throw new \Exception();

        $transactionManager->commit(); //do nothing
    } catch(\Exception $e) {
        $transactionManager->rollback(); //marked as rollback only
    }

    // ...
    $transactionManager->commit(); //this throw exception because transaction is marked as rollback only
} catch(\Exception $e) {
    $transactionManager->rollback(); //REAL rollback
    throw $e->getPrevious();
}