mongo php事务

mongodb开启事务支持

参考:https://blog.csdn.net/liuty66/article/details/126610914

问题定位
经过查阅,发现当MongoDB为单例运行时是无法完成回滚操作的,只有在开启副本集的时候才能使用。

解决方案
Mongodb配置文件
replication:
oplogSizeMB: 2000
replSetName: rs0
enableMajorityReadConcern: true

Mongodb集群初始化
连接进入mongo,使用rs.initiate()初始化副本集。

public function mongodbtest(){
        //连接 mongodb
        $manager = new \MongoDB\Driver\Manager('mongodb://172.16.100.191:27017');
        //开启session
        //causalConsistency  boolean  因果一致性 如果操作依赖先前的操作需要设置为true
        $session = $manager->startSession(['causalConsistency' => true]);
        //开启事务
        $session->startTransaction();
        //下面执行两个写操作
        //批量插入/删除/更新操作
        //ordered  有序操作(TRUE)在MongoDB服务器上串行执行,而无序操作(FALSE)以任意顺序发送到服务器,并且可以并行执行。
        $bulk1 = new \MongoDB\Driver\BulkWrite(['ordered' => true]);
        $bulk1->insert(['name' => 'insert', 'age' => 44]);
        $writeConcern1 = new \MongoDB\Driver\WriteConcern(\MongoDB\Driver\WriteConcern::MAJORITY, 1000);
        //执行批量插入/删除/更新操作
        //第一个参数 databaseName.collectionName
        //第二个参数 要执行的操作
        $manager->executeBulkWrite('huaxiang.user', $bulk1, ['session' => $session, 'writeConcern' => $writeConcern1]);
        $bulk2 = new \MongoDB\Driver\BulkWrite(['ordered' => true]);
        $bulk2->insert(['id' => 2]);
        $writeConcern2 = new \MongoDB\Driver\WriteConcern(\MongoDB\Driver\WriteConcern::MAJORITY, 1000);
        $manager->executeBulkWrite('huaxiang.coin', $bulk2, ['session' => $session, 'writeConcern' => $writeConcern2]);
        //提交事务
        //$session->commitTransaction();
        //事务回滚
        $session->abortTransaction();
        
    }

 

posted @ 2023-03-17 10:51  飞鹰之歌  阅读(53)  评论(0编辑  收藏  举报