onPHP/onphp-framework — pull request #94 by AlexeyDsov (2012-05-01 08:12:23+00:00)
Title: InnerTransaction

Все три используемые хоть как-то в onPHP базы ([Postgres](http://www.postgresql.org/docs/8.1/static/sql-savepoint.html), [Mysql](http://dev.mysql.com/doc/refman/5.5/en/savepoint.html) и [Sqlite](http://sqlite.org/lang_savepoint.html)) поддерживают savepoint'ы, см. ссылки.

Т.к. всегда очень не нравилось при begin следить - внутри ли мы транзакции или еще нет, то написал класс, который это делает вместо вас. Работает с ним примерно так:

```php
commit();
```
Если транзакция не была начата, то он делает в базе begin/commit/rollback. Если транзакция была начата, то использует savepoint'ы внутри транзакции.

Дополнительно для еще большего уменьшения копи-паста работы, когда нужно выполнить набор действий в транзакции, и при успешном их выполнении сделать commit, а в случае ошибки rollback, написал класс InnerTransactionWrapper, с которым работать примерно так:

```php
setDao($dao)
->setFunction($function)
->run($foo);
```
Собственно предлагаю замержить в мастер и если последующим реквестом заменить несколько участков кода в onPHP на использование этого механизма.