首页 > 其他分享 >golang_mongdb 事务

golang_mongdb 事务

时间:2022-08-22 13:24:46浏览次数:74  
标签:事务 mongdb err nil golang var bson Fatal id

这里还没有开始弄 :/Users/mac/工作/goland/github/mongo-go-examples

func TestTransactionCommit(t *testing.T) {
    var err error
    var client *mongo.Client
    var collection *mongo.Collection
    var ctx = context.Background()
    var id = primitive.NewObjectID()
    var doc = bson.M{"_id": id, "hometown": "Atlanta", "year": int32(1998)}
    var result *mongo.UpdateResult
    var session mongo.Session
    var update = bson.D{{Key: "$set", Value: bson.D{{Key: "year", Value: int32(2000)}}}}
    if client, err = getMongoClient(); err != nil {
        t.Fatal(err)
    }
    defer client.Disconnect(ctx)
    collection = client.Database(dbName).Collection(collectionExamples)
    if _, err = collection.InsertOne(ctx, doc); err != nil {
        t.Fatal(err)
    }

    if session, err = client.StartSession(); err != nil {
        t.Fatal(err)
    }
    if err = session.StartTransaction(); err != nil {
        t.Fatal(err)
    }
    if err = mongo.WithSession(ctx, session, func(sc mongo.SessionContext) error {
        if result, err = collection.UpdateOne(sc, bson.M{"_id": id}, update); err != nil {
            t.Fatal(err)
        }
        if result.MatchedCount != 1 || result.ModifiedCount != 1 {
            t.Fatal("replace failed, expected 1 but got", result.MatchedCount)
        }

        if err = session.CommitTransaction(sc); err != nil {
            t.Fatal(err)
        }
        return nil
    }); err != nil {
        t.Fatal(err)
    }
    session.EndSession(ctx)

    var v bson.M
    if err = collection.FindOne(ctx, bson.D{{Key: "_id", Value: id}}).Decode(&v); err != nil {
        t.Fatal(err)
    }
    if v["year"] != int32(2000) {
        t.Log(v)
        t.Fatal("expected 2000 but got", v["year"])
    }

    res, _ := collection.DeleteOne(ctx, bson.M{"_id": id})
    if res.DeletedCount != 1 {
        t.Fatal("delete failed, expected 1 but got", res.DeletedCount)
    }
}

func TestTransactionAbort(t *testing.T) {
    var err error
    var client *mongo.Client
    var collection *mongo.Collection
    var ctx = context.Background()
    var id = primitive.NewObjectID()
    var doc = bson.M{"_id": id, "hometown": "Atlanta", "year": int32(1998)}
    var result *mongo.UpdateResult
    var session mongo.Session
    var update = bson.D{{Key: "$set", Value: bson.D{{Key: "year", Value: int32(2000)}}}}
    if client, err = getMongoClient(); err != nil {
        t.Fatal(err)
    }
    defer client.Disconnect(ctx)
    collection = client.Database(dbName).Collection(collectionExamples)
    if _, err = collection.InsertOne(ctx, doc); err != nil {
        t.Fatal(err)
    }

    if session, err = client.StartSession(); err != nil {
        t.Fatal(err)
    }
    if err = session.StartTransaction(); err != nil {
        t.Fatal(err)
    }
    if err = mongo.WithSession(ctx, session, func(sc mongo.SessionContext) error {
        if result, err = collection.UpdateOne(sc, bson.M{"_id": id}, update); err != nil {
            t.Fatal(err)
        }
        if result.MatchedCount != 1 || result.ModifiedCount != 1 {
            t.Fatal("replace failed, expected 1 but got", result.MatchedCount)
        }

        if err = session.AbortTransaction(sc); err != nil {
            t.Fatal(err)
        }
        return nil
    }); err != nil {
        t.Fatal(err)
    }
    session.EndSession(ctx)

    var v bson.M
    if err = collection.FindOne(ctx, bson.D{{Key: "_id", Value: id}}).Decode(&v); err != nil {
        t.Fatal(err)
    }
    if v["year"] != int32(1998) {
        t.Log(v)
        t.Fatal("expected 1998 but got", v["year"])
    }

    res, _ := collection.DeleteOne(ctx, bson.M{"_id": id})
    if res.DeletedCount != 1 {
        t.Fatal("delete failed, expected 1 but got", res.DeletedCount)
    }
}

 

标签:事务,mongdb,err,nil,golang,var,bson,Fatal,id
From: https://www.cnblogs.com/dogHuang/p/16612483.html

相关文章

  • 深入理解 Spring 事务:入门、使用、原理
    大家好,我是树哥。Spring事务是复杂一致性业务必备的知识点,掌握好Spring事务可以让我们写出更好地代码。这篇文章我们将介绍Spring事务的诞生背景,从而让我们可以更清......
  • mysql6/视图/触发器/事务/四种隔离级别/事务日志/mvcc/内置函数/存储过程/索引/索引的
    视图触发器事务事务处理四种隔离级别事务日志MVCC内置函数存储过程索引索引的意义慢查询优化查询索引模拟视图1.什么是视图?视图是类似于临时表,由sql......
  • golang 查询 ES 最简单的 demo
    分页多条件查询ESfuncTestESQueryDemo(){//ESSDK教程:https://www.yisu.com/zixun/694102.html query:=elastic.NewBoolQuery().Must......
  • 事务
    什么是事务要么都成功,要么都失败1、SQL执行A给B转账A1000--->200B2002、SQL执行B收到A的钱A800-->B400将一组SQL放在一个批次中去执行~事务原则:ACID......
  • golang语法速记
    Golang语言中存在一个关键字type,type又有两种使用方式,一种是类型别名,一种是类型定义。GoLang1.9后对內建定义类型使用了新的写法:typeNewName=Type这个NewName只是Typ......
  • Golang基础入门
    基础入门1、输出输出,在运行代码时将内容在终端输出。packagemainimport"fmt"funcmain(){fmt.Println("helloword!")}在Go中提供了多种输出的方式......
  • 事务管理(十二)
    1.概要什么是事务事务是由N步数据库操作序列组成的逻辑执行单元,这系列操作要么全执行,要么全放弃执行。事务的特性(ACID)原子性(Atomicity):事务是应用中不可再分的......
  • Golang的IDE的安装
    Golang的IDE的安装Goland是一款由JetBrains公司开发的软件,使用他可以大大提高程序员开发Go代码的效率,因为Goland内部提供了编辑器、调试器和图形用户界面等很多方便的功......
  • golang反射reflect
    1reflect包reflect包实现了运行时反射,允许程序操作任意类型的对象。典型用法是用静态类型interface{}保存一个值,通过调用TypeOf获取其动态类型信息,该函数返回一个Type类......
  • spring5 事务 纯注解开发
    1.TxConfigpackagecom.config;importcom.alibaba.druid.pool.DruidDataSource;importorg.springframework.context.annotation.Bean;importorg.springframework.......