mongodb 事务操作

12 篇文章 1 订阅
事务必须用在复制集上:
获取session:session = db.getMongo().startSession()
开启事务:session.startTransaction()
获得collection:yun1 = session.getDatabase(“database”).yun1
操作:yun1.insert({“ggggggg”:1})
获得collection:yun2 = session.getDatabase(“database”).yun2
操作:yun2.insert({“ggggggg”:1})
回滚事务:session.abortTransaction()
提交事务:session.commitTransaction()
————————————————
版权声明:本文为CSDN博主「云哥哥_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yuanfengyun/article/details/83819815

php操作如下:用commond操作

<?php
//phpinfo();
//exit;
function dump($a){
    echo '<pre>';
    var_dump($a);
    echo '</pre>';
}

///使用单独一个数据库
function justinsert(){
    $manager = new MongoDB\Driver\Manager("mongodb://127.0.0.1:27017");

    // 直接插入数据
    $bulk = new MongoDB\Driver\BulkWrite();
    $bulk->insert(['x' => 1, 'name'=>'菜鸟教程', 'url' => 'http://www.runoob.com']);
    $bulk->insert(['x' => 2, 'name'=>'Google', 'url' => 'http://www.google.com']);
    $bulk->insert(['x' => 3, 'name'=>'taobao', 'url' => 'http://www.taobao.com']);
    $manager->executeBulkWrite('test.sites', $bulk);

    return $manager;
}


/// 使用副本集数据库
function transactioninsert(){
    $manager = new MongoDB\Driver\Manager("mongodb://127.0.0.1:27017,127.0.0.1:27018,127.0.0.1:27019/?replicaSet=rsa");

    //mongodb必须是副本集数据库才可以使用事务,使用事务插入数据
    $ReadPreference = new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_PRIMARY);
    $session = $manager->startSession([
        'readPreference'=>$ReadPreference
    ]);
    try{
        // 显式开启事务
        $ReadConcern = new MongoDB\Driver\ReadConcern("snapshot");
        $WriteConcern = new MongoDB\Driver\WriteConcern('majority', 1000);
        $options = [
            'readConcern'=> $ReadConcern,
            'writeConcern'=> $WriteConcern,
        ];
        $session->startTransaction($options);
        $insert = [
            ['x' => 1, 'name'=>'菜鸟教程', 'url' => 'http://www.runoob.com']
        ];
        $model = new model("stock");
        $command = $model->insert($insert);
        $model = new model("stock");
        $command = $model->update();
        $res = $manager->executeWriteCommand('ushop',$command,[
            'session'=>$session
        ]);//var_dump($res);exit;
        //$session->abortTransaction();
    }catch (\MongoDB\Driver\Exception\Exception $e){
        // 回滚事务
        $session->abortTransaction();
        dump($e->getMessage());
        exit;
    }
 提交事务
    $session->commitTransaction();

    return $manager;
}
transactioninsert();
/*
$manager = justinsert();

$filter = ['x' => ['$gt' => 1]];
$options = [
    'projection' => ['_id' => 0],
    'sort' => ['x' => -1],
];

// 查询数据
$query = new MongoDB\Driver\Query($filter, $options);
$cursor = $manager->executeQuery('test.sites', $query);

foreach ($cursor as $document) {
    $document = json_encode($document);
    $document = json_decode($document,true);
    dump($document);
}
*/

//$bulk = new MongoDB\Driver\BulkWrite();
//$bulk->delete(['x' => ['$gt'=>1]], ['limit' => 0]);   // limit 为 0 时,删除所有匹配数据
//$manager->executeBulkWrite('test.sites', $bulk);


/// 创建集合的类 ,给command使用
class model {
    protected $cmd = array();
    protected $tables = '';

    function __construct($tables) {
        $this->tables = (string)$tables;
        return $this;
    }
    function getCommand() {
        return new MongoDB\Driver\Command($this->cmd);
    }

    function insert($data){
        $this->cmd['insert'] = $this->tables;
        $this->cmd['documents'] = $data;
        return $this->getCommand();
    }
    function array2object($array)
    {
        if (is_array($array)) {
            $obj = new StdClass();
            foreach ($array as $key => $val) {
                $obj->$key = $val;
            }
        } else {
            $obj = $array;
        }
        return $obj;
    }

    function update($data=[]){
        //$this->cmd = [];
        $this->cmd = [
            'update'=>$this->tables,
            'updates'=>[
                [
                    'q'=>['x'=>1],
                    'u'=>['$set'=>['x'=>2]]
                ]
            ]
        ];
        return $this->getCommand();
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MongoDB事务是指在MongoDB数据库中执行多个操作的一组操作,要么都成功,要么都失败。在MongoDB 4.0及更高版本中,引入了多文档事务的支持。多文档事务允许对已存在的集合或数据库执行读写操作,但不允许在事务中创建、删除集合或进行索引操作。 要使用事务,你需要部署MongoDB 4.2或更高版本,并更新MongoDB的驱动程序为4.2或更高版本。确保驱动程序的兼容性是非常重要的。 MongoDB事务实现采用了两阶段提交(Two-Phase Commit)的方法。在事务提交之前,MongoDB会先执行预提交阶段,将所有的写操作保存到事务日志(oplog)中。然后,在第二阶段,MongoDB会对所有的写操作进行确认提交,如果有任何一个操作失败,整个事务都会回滚。 使用MongoDB事务可以确保数据的一致性和可靠性,实现ACID的特性,即原子性、一致性、隔离性和持久性。这意味着事务中的操作要么全部成功,要么全部失败,保证了数据的完整性和可靠性。 总结来说,MongoDB事务是一组操作的集合,要么全部成功,要么全部失败。它的实现采用了两阶段提交的方法,确保数据的一致性和可靠性,实现ACID的特性。使用事务需要在MongoDB 4.2及以上版本,并更新驱动程序的版本。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [MongoDB事务](https://blog.csdn.net/ntzzzsj/article/details/125527368)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [MongoDB数据库两阶段提交实现事务的方法详解](https://download.csdn.net/download/weixin_38663544/12825081)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值