【问题标题】:PHP - filesystem lib with command patternPHP - 带有命令模式的文件系统库
【发布时间】:2014-04-10 17:51:15
【问题描述】:

我正在寻找一个实现命令模式的文件系统库,因此我可以撤消在文件系统中所做的更改,例如由于数据库错误,我可以以原始方式轻松保护数据完整性(可能是悲观锁定)。 ..

你知道这样的系统,还是我必须自己实现?

这个例子会有点虚,因为我们通常会用文件替换来做,我们会将文件名保存在数据库中。请暂时忘记这一点...

例子:

try {
    $delete = $file1->delete();
    $create = $file2->create();
    $trans = $db->createTransaction(function () use ($db){
        $stmt = $db->prepare('UPDATE files SET name = :new_name WHERE name = :old_name');
        $stmt->execute(array(
            'old_name' => $file1->name,
            'new_name' => $file2->name
        ));
    });
    $trans->commit();
}
catch(Exception $e){
    if ($trans)
        $trans->rollback();
    if ($create)
        $create->undo();
    if ($delete)
        $delete->undo();
    throw $e;
}

办公室。我想自动处理回滚,并检查文件锁定顺序(如果有锁)是否为 abc 以防止死锁。

例如使用类似这样的界面:

try {
    $commands = new Commands();
    $commands->add(new FileDeleteCommand($file1));
    $commands->add(new FileCreateCommand($file2));
    $commands->add(new DatabaseTransaction(
        function ($db) use ($file1, $file2){
            $stmt = $db->prepare('UPDATE files SET name = :new_name WHERE name = :old_name');
            $stmt->execute(array(
                'old_name' => $file1->name,
                'new_name' => $file2->name
            ));
        }
    ));
    $commands->execute();
}
catch(Exception $e){
    $commands->undo();
    throw $e;
}

这种方法有一些限制,例如我必须在最后提交事务,因为当它已经提交时我无法回滚它,但我可以忍受......

或替代接口:

try {
    $transactions = new DistributedTransaction();

    $transactions->add(new FileSystemTransaction(
        function () use ($file1, $file2){
            $file1->delete();
            $file2->create();
        }
    ));

    $transactions->add(new DatabaseTransaction(
        function ($db) use ($file1, $file2){
            $stmt = $db->prepare('UPDATE files SET name = :new_name WHERE name = :old_name');
            $stmt->execute(array(
                'old_name' => $file1->name,
                'new_name' => $file2->name
            ));
        }
    ));
    $transactions->commit();
}
catch(Exception $e){
    $transactions->rollback();
    throw $e;
}

问题是我们如何一次提交 2 个事务?我认为我们实现其中之一的唯一方法:文件系统事务,但我愿意接受建议......

我添加了一个新标签,我认为这是一个简单的distributed transaction 问题,涉及数据库事务资源和文件系统事务资源。

【问题讨论】:

  • 事务数据库有什么问题?
  • 没什么,我只是不想将文件存储在数据库中。顺便提一句。我喜欢有选择...
  • 但是您正在寻找的是事务数据库。或者你的意思是VCS?喜欢 git/SVN 吗?
  • 不。我想将上传的文件和它们的名称存储在数据库中。在这种情况下,数据完整性可能会被破坏,例如当数据库连接失败并且文件已被修改时。悲观锁定或带有临时多版本文件的乐观锁定可以是解决方案,但我不想构建整个数据库,只是一个简单的保护。
  • 我添加了一个例子,也许它更干净。

标签: php transactions filesystems distributed-transactions


【解决方案1】:

我还没有在 PHP 中找到类似的东西,所以我开始了自己的 php-transactions 项目来填补空白。

它将具有功能有限的分布式事务和文件系统事务的实现。我打算为协作多任务添加一些支持,这样当它们相互依赖时,分离文件系统和数据库事务会更容易。它将与 Promise 和生成器一起使用。我想我会在 2014 年 6 月之前完成 1.0。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-25
    • 2020-03-27
    • 2013-02-22
    • 2016-09-21
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 2010-10-20
    相关资源
    最近更新 更多