在PHP中重构嵌套的MySQL事务

时间:2015-05-26 09:10:21

标签: php mysql transactions

我有一个像

这样的简单功能
function transfer_money($from, $to, $amount) {
    // START TRANSACTION 

    deduct_money($from, $amount); // already using transaction internally
    add_money($to, $amount); // already using transaction internally

    // COMMIT;
}

假设函数deduct_moneyadd_money已经在内部使用事务,我如何用另一个事务包装新函数?

1 个答案:

答案 0 :(得分:0)

假设您希望您的两个函数按原样继续使用事务,但希望将整个过程包装在更高级别的"事务,您可以构建自己的方法/函数来开始和结束事务......例如:

<?php 

class Transaction 
{
    private static $stack = 0;

    public static function begin(PDO $adapter) 
    {
        if(self::$stack === 0) {
            $adapter->beginTransaction();
        }
        self::$stack++;
    }

    public static function commit(PDO $adapter)
    {
        if(self::$stack === 0) {
            throw new Exception('Cannot commit as no transaction has begun');
        }

        self::$stack--;

        if(self::$stack === 0) {
            $adapter->commit();
        }
    }
}

这将允许你&#34;堆叠&#34;事务和事务只有在提交事务的相同数量的调用已被收到作为启动事务的数字时才会被提交。