欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

mongodb有沒有事務(wù)

今天就跟大家聊聊有關(guān)MongoDB有沒有事務(wù),可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

創(chuàng)新互聯(lián)建站專注于企業(yè)成都全網(wǎng)營銷推廣、網(wǎng)站重做改版、玉龍網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5頁面制作商城系統(tǒng)網(wǎng)站開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為玉龍等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

MongoDB 4.0 引入的事務(wù)功能,支持多文檔 ACID 特性,例如使用 mongo shell 進(jìn)行事務(wù)操作。

> s = db.getMongo().startSession()
    session { "id" : UUID("3bf55e90-5e88-44aa-a59e-a30f777f1d89") }
    > s.startTransaction()
    > session.getDatabase("mytest").coll01.insert({x: 1, y: 1})
    WriteResult({ "nInserted" : 1 })
    > session.getDatabase("mytest").coll02.insert({x: 1, y: 1})
    WriteResult({ "nInserted" : 1 })
    > s.commitTransaction()  (或者 s.abortTransaction()回滾事務(wù))

支持 MongoDB 4.0 的其他語言 Driver 也封裝了事務(wù)相關(guān)接口,用戶需要?jiǎng)?chuàng)建一個(gè) Session,然后在 Session 上開啟事務(wù),提交事務(wù)。例如:

python 版本

with client.start_session() as s:
    s.start_transaction()
    collection_one.insert_one(doc_one, session=s)
    collection_two.insert_one(doc_two, session=s)
    s.commit_transaction()

java 版本

try (ClientSession clientSession = client.startSession()) {
   clientSession.startTransaction();
   collection.insertOne(clientSession, docOne);
   collection.insertOne(clientSession, docTwo);
   clientSession.commitTransaction();
}

一、預(yù)備工作

1、MongoDB需要4.0版本+

2、需要自己搭建MongoDB復(fù)制集,單個(gè)mongodb server 不支持事務(wù)。

事務(wù)原理:mongodb的復(fù)制至少需要兩個(gè)節(jié)點(diǎn)。其中一個(gè)是主節(jié)點(diǎn),負(fù)責(zé)處理客戶端請求,其余的都是從節(jié)點(diǎn),負(fù)責(zé)復(fù)制主節(jié)點(diǎn)上的數(shù)據(jù)。mongodb各個(gè)節(jié)點(diǎn)常見的搭配方式為:一主一從、一主多從。主節(jié)點(diǎn)記錄在其上的所有操作oplog,從節(jié)點(diǎn)定期輪詢主節(jié)點(diǎn)獲取這些操作,然后對自己的數(shù)據(jù)副本執(zhí)行這些操作,從而保證從節(jié)點(diǎn)的數(shù)據(jù)與主節(jié)點(diǎn)一致。

3、搭建復(fù)制集步驟

啟動(dòng)mongo主節(jié)點(diǎn)實(shí)例,bin目錄下命令窗口執(zhí)行,復(fù)制集命名為doudou, 8080端口的數(shù)據(jù)庫文件位于db1目錄下,--dbpath=路徑寫自己的,啟動(dòng)后勿關(guān)閉命令窗口

mongod --replSet doudou --dbpath=E:\mongoDb\data\db1 --port=8080  

啟動(dòng)mongo從節(jié)點(diǎn)實(shí)例,bin目錄下命令窗口執(zhí)行,復(fù)制集命名為doudou, 8081端口的數(shù)據(jù)庫文件位于db2目錄下,--dbpath=路徑寫自己的,啟動(dòng)后勿關(guān)閉命令窗口

mongod --replSet doudou --dbpath=E:\mongoDb\data\db2 --port=8081

兩個(gè)節(jié)點(diǎn)啟動(dòng)后,bin目錄下打開命令窗口,連接主節(jié)點(diǎn)

mongo --port=8080

命令初始化

rs.initiate()

兩個(gè)節(jié)點(diǎn)啟動(dòng)后,bin目錄下打開命令窗口,連接主節(jié)點(diǎn)

mongo --port=8080

成功后如圖:

mongodb有沒有事務(wù)

命令初始化

rs.initiate()

效果如圖:

mongodb有沒有事務(wù)

成功的結(jié)果是(ok項(xiàng)是1,失敗是0)

查看是否是主節(jié)點(diǎn) rs.isMaster()

查看復(fù)制集狀態(tài) rs.status()

初始化配置

rs.conf()

向主節(jié)點(diǎn)添加從節(jié)點(diǎn)

rs.add("localhost:8081")

查看主節(jié)點(diǎn)狀態(tài)

rs.status()

復(fù)制集配置完成。

二、復(fù)制集中的坑點(diǎn)

1、需使用mongoose.connection對集合進(jìn)行事務(wù)操作,其他model的CRUD方法不支持事務(wù)。

mongoose.connection.collection('集合名') // 注:集合名需要小寫且加s,如model為Cat,集合名這里應(yīng)寫為cats

2、觸發(fā)Schema定義的中間件默認(rèn)值需要構(gòu)造model實(shí)例

const CatSchema = new Schema({
    name: {
        type: String
        default: 'cat'
    },
    created: {
     type: Date,
     default: Date.now
  }
})
 
const Cat = mongoose.model('Cat', CatSchema)
 
new Cat() // 觸發(fā)中間件

3、insertOne,findOneAndUpdate等方法對數(shù)據(jù)的新增,需上面第二點(diǎn)進(jìn)行依賴,否則直接insertOne插入一條數(shù)據(jù),定義的默認(rèn)值不會觸發(fā),如created字段,chema內(nèi)部定義的type:Schema.ObjectId的相應(yīng)字段,insertOne插入后都會變成字符串類型,不是Schema.ObjectId類型。

// 解決方式
//新增
 
const Cat= new Cat();
const data = {name: 5}
for (let key in data) {
      Cat[key] = data[key];
    }
db.collection('cats').insertOne(Cat);
 
// 查詢修改
 
db.collection('cats')
.findOneAndUpdate({_id: mongoose.Types.ObjectId(你的id)}, {$set: {name: 修改值}})

三、開始事務(wù)

注:以下皆為egg實(shí)例代碼

封裝獲取session函數(shù)

// 獲取session,回滾事務(wù)
  async getSession(opt = {
    readConcern: { level: "snapshot" },
    writeConcern: { w: "majority" }
  }) {
    const { mongoose } = this.app
    const session = await mongoose.startSession(opt);
    await session.startTransaction();
    return session
  }

執(zhí)行事務(wù)邏輯

const { mongoose } = this.ctx.app;
const session = await this.ctx.getSession();
const db = mongoose.connection;
try {
  const data = this.ctx.request.body;
  const Cat = new this.ctx.model.Cat();
  for (let key in data) {
    Cat[key] = data[key]
  }
  await db
    .collection('cats')
    .insertOne(Cat, { session });
  // 提交事務(wù)
  await session.commitTransaction();
  this.ctx.end();
} catch (err) {
  // 回滾事務(wù)
  await session.abortTransaction();
  this.ctx.logger.error(new Error(err));
} finally {
  await session.endSession();
}

看完上述內(nèi)容,你們對mongodb有沒有事務(wù)有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

當(dāng)前名稱:mongodb有沒有事務(wù)
瀏覽路徑:http://www.chinadenli.net/article36/gghcsg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)微信公眾號企業(yè)建站面包屑導(dǎo)航網(wǎng)站設(shè)計(jì)品牌網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司