2017 © Pedro Peláez
 

library transactionalphp

Transactional PHP.

image

gielfeldt/transactionalphp

Transactional PHP.

  • Thursday, August 18, 2016
  • by gielfeldt
  • Repository
  • 1 Watchers
  • 0 Stars
  • 1,171 Installations
  • PHP
  • 0 Dependents
  • 0 Suggesters
  • 0 Forks
  • 0 Open issues
  • 9 Versions
  • 34 % Grown

The README.md

Transactional PHP

[Build Status][8] Test Coverage [Scrutinizer Code Quality][7] Code Climate, (*1)

Latest Stable Version Latest Unstable Version License Total Downloads, (*2)

Installation

To install the Transactional PHP library in your project using Composer, first add the following to your composer.json config file., (*3)

{
    "require": {
        "gielfeldt/transactionalphp": "^0.8"
    }
}

Then run Composer's install or update commands to complete installation. Please visit the Composer homepage for more information about how to use Composer., (*4)

Transactional PHP

This class allows to buffer php code in a simulated transaction, thereby postponing the execution of the code until a commit occurs., (*5)

Motivation

  1. Problem of keeping external cache in sync with the database, see the Drupal module Cache Consistent.

Using the Transactional PHP library

Example 1 - Simple
namespace Gielfeldt\TransactionalPHP\Example;

require 'vendor/autoload.php';

use Gielfeldt\TransactionalPHP\Connection;

$connection = new Connection();

// Start outer transaction.
$connection->startTransaction();

$connection->onCommit(function () {
    print "THIS WILL BE PRINTED, BECAUSE THIS WILL BE COMMITTED\n";
});

// Start inner transaction.
$connection->startTransaction();

$connection->onCommit(function () {
    print "THIS WILL NOT BE PRINTED, BECAUSE THIS WILL BE ROLLED BACK\n";
});

// Rollback inner transaction.
$connection->rollbackTransaction();

// Commit inner transaction.
$connection->commitTransaction();
Example 2 - Commit and rollback
namespace Gielfeldt\TransactionalPHP\Example;

require 'vendor/autoload.php';

use Gielfeldt\TransactionalPHP\Connection;
use Gielfeldt\TransactionalPHP\Operation;

$connection = new Connection();

$operation = new Operation();
$operation->onCommit(function () {
    print "THIS WILL BE PRINTED IMMEDIATELY, BECAUSE NO TRANSACTION HAS BEGUN\n";
})
->onRollback(function () {
    print "THIS WILL NEVER BE PRINTED, BECAUSE NO TRANSACTION HAS BEGUN\n";
});
$connection->addOperation($operation);

// Start outer transaction.
$connection->startTransaction();

$operation = new Operation();
$operation->onCommit(function () {
    print "THIS WILL BE PRINTED, BECAUSE THIS WILL BE COMMITTED\n";
})
->onRollback(function () {
    print "THIS WILL NEVER BE PRINTED, BECAUSE THIS WILL BE COMMITTED\n";
});
$connection->addOperation($operation);

// Start inner transaction.
$connection->startTransaction();

$operation = new Operation();
$operation->onCommit(function () {
    print "THIS WILL NOT BE PRINTED, BECAUSE THIS WILL BE ROLLED BACK\n";
})
->onRollback(function () {
    print "THIS WILL BE PRINTED, BECAUSE THIS WILL BE ROLLED BACK\n";
});
$connection->addOperation($operation);

// Rollback inner transaction.
$connection->rollbackTransaction();

// Commit inner transaction.
$connection->commitTransaction();
Example 3 - Using the indexer
namespace Gielfeldt\TransactionalPHP\Example;

require 'vendor/autoload.php';

use Gielfeldt\TransactionalPHP\Connection;
use Gielfeldt\TransactionalPHP\Indexer;
use Gielfeldt\TransactionalPHP\Operation;

$connection = new Connection();
$indexer = new Indexer($connection);

$operation = (new Operation())
    ->onCommit(function () {
        print "THIS WILL BE PRINTED IMMEDIATELY, BECAUSE NO TRANSACTION HAS BEGUN\n";
    })
    ->onRollback(function () {
        print "THIS WILL NEVER BE PRINTED, BECAUSE NO TRANSACTION HAS BEGUN\n";
    })
    ->onBuffer(function ($operation) use ($indexer) {
        print "INDEXING test1\n";
        $indexer->index($operation, 'test1');
    })
    ->setMetadata('value', 'test1');
$connection->addOperation($operation);

// Start outer transaction.
$connection->startTransaction();

$operation = (new Operation())
    ->onCommit(function () {
        print "THIS WILL BE PRINTED, BECAUSE THIS WILL BE COMMITTED\n";
    })
    ->onRollback(function () {
        print "THIS WILL NEVER BE PRINTED, BECAUSE THIS WILL BE COMMITTED\n";
    })
    ->onBuffer(function ($operation) use ($indexer) {
        print "INDEXING test2\n";
        $indexer->index($operation, 'test2');
    })
    ->setMetadata('value', 'test2');
$connection->addOperation($operation);

// Start inner transaction.
$connection->startTransaction();

$operation = (new Operation())
    ->onCommit(function () {
        print "THIS WILL NOT BE PRINTED, BECAUSE THIS WILL BE ROLLED BACK\n";
    })
    ->onRollback(function () {
        print "THIS WILL BE PRINTED, BECAUSE THIS WILL BE ROLLED BACK\n";
    })
    ->onBuffer(function ($operation) use ($indexer) {
        print "INDEXING test3\n";
        $indexer->index($operation, 'test3');
    })
    ->setMetadata('value', 'test3');
$connection->addOperation($operation);

$operation = (new Operation())
    ->onCommit(function () {
        print "THIS WILL NOT BE PRINTED, BECAUSE THIS WILL BE ROLLED BACK - second\n";
    })
    ->onRollback(function () {
        print "THIS WILL BE PRINTED, BECAUSE THIS WILL BE ROLLED BACK - second\n";
    })
    ->onBuffer(function ($operation) use ($indexer) {
        print "INDEXING test3 - second\n";
        $indexer->index($operation, 'test3');
    })
    ->setMetadata('value', 'test3 - second');
$connection->addOperation($operation);

foreach ($indexer->lookup('test1') as $operation) {
    print "Looked up test1 - found: " . $operation->getMetadata('value') . "\n";
}
foreach ($indexer->lookup('test2') as $operation) {
    print "Looked up test2 - found: " . $operation->getMetadata('value') . "\n";
}
foreach ($indexer->lookup('test3') as $operation) {
    print "Looked up test3 - found: " . $operation->getMetadata('value') . "\n";
}

// Rollback inner transaction.
$connection->rollbackTransaction();

// Commit inner transaction.
$connection->commitTransaction();
Example 4 - Value store using the indexer for lookups
namespace Gielfeldt\TransactionalPHP\Example;

require 'vendor/autoload.php';

use Gielfeldt\TransactionalPHP\Connection;
use Gielfeldt\TransactionalPHP\Indexer;

$connection = new Connection();
$indexer = new Indexer($connection);

// Start outer transaction.
$connection->startTransaction();
print "Started outer transaction\n";

$indexer->index($connection->addMetadata('value', 'value1'), 'test1');
$indexer->index($connection->addMetadata('value', 'value2'), 'test1');
$indexer->index($connection->addMetadata('value', 'value1'), 'test2');
$indexer->index($connection->addMetadata('value', 'value2'), 'test2');
print "Added data to indexer\n";

foreach ($indexer->lookup('test1') as $operation) {
    print "Looked up test1 - found: " . $operation->getMetadata('value'). "\n";
}
foreach ($indexer->lookup('test2') as $operation) {
    print "Looked up test2 - found: " . $operation->getMetadata('value'). "\n";
}

// Start inner transaction.
$connection->startTransaction();
print "Started inner transaction\n";

$indexer->index($connection->addMetadata('value', 'value3'), 'test1');
$indexer->index($connection->addMetadata('value', 'value3'), 'test2');
print "Added data to indexer\n";

foreach ($indexer->lookup('test1') as $operation) {
    print "Looked up test1 - found: " . $operation->getMetadata('value'). "\n";
}
foreach ($indexer->lookup('test2') as $operation) {
    print "Looked up test2 - found: " . $operation->getMetadata('value'). "\n";
}

// Rollback inner transaction.
$connection->rollbackTransaction();
print "Rolled back inner transaction\n";

foreach ($indexer->lookup('test1') as $operation) {
    print "Looked up test1 - found: " . $operation->getMetadata('value'). "\n";
}
foreach ($indexer->lookup('test2') as $operation) {
    print "Looked up test2 - found: " . $operation->getMetadata('value'). "\n";
}

// Easy values lookup.
var_dump($indexer->lookupMetadata('test1', 'value'));
var_dump($indexer->lookupMetadata('test2', 'value'));

// Commit inner transaction.
$connection->commitTransaction();
print "Committed outer transaction\n";

foreach ($indexer->lookup('test1') as $operation) {
    print "Looked up test1 - found: " . $operation->getMetadata('value'). "\n";
}
foreach ($indexer->lookup('test2') as $operation) {
    print "Looked up test2 - found: " . $operation->getMetadata('value'). "\n";
}

For more examples see the examples/ folder., (*6)

Features

  • Transactionalize PHP code.
  • Index operations for lookup.

Caveats

  1. Lots probably.

The Versions

18/08 2016

dev-master

9999999-dev https://github.com/gielfeldt/transactionalphp

Transactional PHP.

  Sources   Download

MIT

The Requires

  • php >=5.4.0

 

by Thomas Gielfeldt

database php transactions transactional

18/08 2016

0.8.0

0.8.0.0 https://github.com/gielfeldt/transactionalphp

Transactional PHP.

  Sources   Download

MIT

The Requires

  • php >=5.4.0

 

by Thomas Gielfeldt

database php transactions transactional

14/06 2016

0.7.0

0.7.0.0 https://github.com/gielfeldt/transactionalphp

Transactional PHP.

  Sources   Download

MIT

The Requires

  • php >=5.4.0

 

by Thomas Gielfeldt

database php transactions transactional

13/06 2016

0.6.0

0.6.0.0 https://github.com/gielfeldt/transactionalphp

Transactional PHP.

  Sources   Download

MIT

The Requires

  • php >=5.4.0

 

by Thomas Gielfeldt

database php transactions transactional

08/06 2016

0.5.0

0.5.0.0 https://github.com/gielfeldt/transactionalphp

Transactional PHP.

  Sources   Download

MIT

The Requires

  • php >=5.4.0

 

by Thomas Gielfeldt

database php transactions transactional

22/05 2016

0.4.0

0.4.0.0 https://github.com/gielfeldt/transactionalphp

Transactional PHP.

  Sources   Download

MIT

The Requires

  • php >=5.4.0

 

by Thomas Gielfeldt

database php transactions transactional

21/05 2016

0.3.0

0.3.0.0 https://github.com/gielfeldt/transactionalphp

Transactional PHP.

  Sources   Download

MIT

The Requires

  • php >=5.4.0

 

by Thomas Gielfeldt

database php transactions transactional

21/05 2016

0.2.0

0.2.0.0 https://github.com/gielfeldt/transactionalphp

Transactional PHP.

  Sources   Download

MIT

The Requires

  • php >=5.4.0

 

by Thomas Gielfeldt

database php transactions transactional

21/05 2016

0.1.0

0.1.0.0 https://github.com/gielfeldt/transactionalphp

Transactional PHP.

  Sources   Download

MIT

The Requires

  • php >=5.6.0

 

by Thomas Gielfeldt

database php transactions transactional