* $from = 1; * $to = 2; * $amount = 300; * * R::transaction(function() use($from, $to, $amount) * { * $accountFrom = R::load('account', $from); * $accountTo = R::load('account', $to); * $accountFrom->money -= $amount; * $accountTo->money += $amount; * R::store($accountFrom); * R::store($accountTo); * }); * * * @param Adapter $adapter Database Adapter providing transaction mechanisms. * @param callable $callback Closure (or other callable) with the transaction logic * * @return mixed */ public static function transaction( Adapter $adapter, $callback ) { if ( !is_callable( $callback ) ) { throw new RedException( 'R::transaction needs a valid callback.' ); } static $depth = 0; $result = null; try { if ( $depth == 0 ) { $adapter->startTransaction(); } $depth++; $result = call_user_func( $callback ); //maintain 5.2 compatibility $depth--; if ( $depth == 0 ) { $adapter->commit(); } } catch ( \Exception $exception ) { $depth--; if ( $depth == 0 ) { $adapter->rollback(); } throw $exception; } return $result; } }