php - 在 PHP 中重构嵌套 MySQL 事务

标签 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 已在内部使用事务,我如何用另一个事务包装新函数?

最佳答案

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

<?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();
        }
    }
}

这将允许您“堆叠”事务,并且仅当收到与启动事务的次数相同数量的提交事务的调用时才会提交事务。

关于php - 在 PHP 中重构嵌套 MySQL 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30454266/

相关文章:

php - 在特定查询中对同一字段的结果集进行排序

php - 如何两次加入另一个表?

php - 帮我调试我的 SQL INSERT,好吗?

php - 在同一域中有多个 Laravel 实例时出现 session /cookie 错误

mysql - 与组中最大日期关联的 ID

mysql - 使用 SQL GROUP BY 时,一个 'group' 可能有多个不同的值

postgresql - 事务中的 Postgres 锁

mysql - 在跨两列重复的 MySql 删除上使用 LIMIT

java - 使用 AbstractTransactionalJUnit4SpringContextTests 中途提交

sql - 需要mysql死锁解释