docs/transactions.rst

Summary

Maintainability
Test Coverage
============
Transactions
============

When you work with the DSQL, you can work with transactions. There are 2
enhancements to the standard functionality of transactions in DSQL:

1. You can start nested transactions.

2. You can use :php:meth:`Connection::atomic()` which has a nicer syntax.

It is recommended to always use atomic() in your code.

.. php:class:: Connection


.. php:method:: atomic($callback)

    Execute callback within the SQL transaction. If callback encounters an
    exception, whole transaction will be automatically rolled back::

        $c->atomic(function() use($c) {
            $c->dsql('user')->set('balance=balance+10')->where('id', 10)->update();
            $c->dsql('user')->set('balance=balance-10')->where('id', 14)->update();
        });

    atomic() can be nested.
    The successful completion of a top-most method will commit everything.
    Rollback of a top-most method will roll back everything.

.. php:method:: beginTransaction

    Start new transaction. If already started, will do nothing but will increase
    transaction depth.

.. php:method:: commit

    Will commit transaction, however if :php:meth:`Connection::beginTransaction`
    was executed more than once, will only decrease transaction depth.

.. php:method:: inTransaction

    Returns true if transaction is currently active. There is no need for you to
    ever use this method.

.. php:method:: rollBack

    Roll-back the transaction, however if :php:meth:`Connection::beginTransaction`
    was executed more than once, will only decrease transaction depth.



.. warning:: If you roll-back internal transaction and commit external
    transaction, then result might be unpredictable.
    Please discuss this https://github.com/atk4/dsql/issues/89