lomocoin/php-mongo-transaction

为Mongodb提供简单的交易功能

0.1.1 2018-07-17 09:26 UTC

This package is not auto-updated.

Last update: 2024-09-19 13:56:01 UTC


README

概览

在使用MongoDB时,你是否想念RDBMS中的事务功能?你并不孤单。

有消息称MongoDB未来将支持ACID,但如果我们现在就需要它呢?

好吧,PHP-Mongo-Transaction提供了一个类似于RDBMS的简单基本事务功能。

流程很简单,只需开始一个事务,执行一些操作,然后提交或回滚。

实现这一概念的方法也很简单:在MongoDB中建立一个记录集合来跟踪数据的修改,并在回滚时恢复。

也就是说,一旦一个事务想要回滚,它将会

  • 删除已插入的内容
  • 将已删除的内容重新插入(带有相同的ID)
  • 用原始副本替换已修改的数据(带有相同的ID)

为了实现这一点,这个库封装了MongoDB Driver提供的基本insertOneupdateOnedeleteOne函数。

请查看此文档的用法部分,了解如何轻松使用它。

限制

  1. 我们假设数据库正常运行,因此如果数据库发生故障,事务可能无法正确回滚,并将保持为进行中状态。你可能需要一个cron作业来检测一切是否正常,并在出现问题时代手动调查。如果一切顺利,事务的状态应该是提交回滚,除了真正的初始化进行中状态之外。

  2. 在当前阶段,我们无法处理并发问题。在并发场景下确保数据一致性太复杂了。我们建议你考虑使用简单的锁定机制来避免两个事务同时写入同一记录,或者采用消息队列系统来保持事务执行的顺序。

路线图

  • 更多的单元测试
  • 增强文档
  • 支持insertManyupdateManydeleteMany

注意

你可以使用与此库一起使用的Persistable类,但在bsonSerializebsonUnserialize中不要进行任何魔法操作,例如:自动更新“最后修改日期”。

这些函数中的任何魔法都肯定会破坏有效数据状态

安装

composer require lomocoin/php-mongo-transaction

用法

1. 需要包含autoload.php文件

require __DIR__ . '/vendor/autoload.php';

2. 创建事务对象

use Lomocoin\Mongodb\Config\TransactionConfig;
use Lomocoin\Mongodb\Transaction\Transaction;
use MongoDB\Client;

$dbName = 'lomocoin_mongodb_test';
$config = new TransactionConfig(
    new Client(),
    $dbName,
    'lomocoin_mongodb_test_transaction_log',
    'lomocoin_mongodb_test_transaction_state_change_log');

$transaction = Transaction::begin($config);

3. 进行更改

3.1 插入

$collection = $config->getMongoDBClient()->$dbName->testCollection;

$transaction->insertOne($collection, [
    'username' => 'B',
    'email'    => 'b@example.com',
    'name'     => 'BB',
]);

3.2 更新

$transaction->updateOne($collection, [
    'username' => 'B',
], [
    '$set' => [
        'name' => 'BBB',
    ],
]);

3.3 删除

$transaction->deleteOne($collection, ['username' => 'B']);

4. 提交或回滚

// if no error happens, you commit
$transaction->commit();

// if any error happens, you rollback
$transaction->rollback();

贡献者

陈盛汉 | viest

许可证

Apache License 2.0