【MongoDB】4.0版本事務(wù)上手測(cè)試-創(chuàng)新互聯(lián)

事務(wù)上手測(cè)試

基礎(chǔ):

原來3版本的只能叫單文檔事務(wù),即針對(duì)行的事務(wù)。所以沒必要顯式提供調(diào)用,多文檔事務(wù)由于有損耗,照顧到性能的需求,提供了事務(wù)開啟關(guān)閉的接口。
多行,多集合,多庫(kù)之間讀肯定會(huì)牽扯到一致性讀,所以多文檔事務(wù)肯定是有必要的。
4.2版本可能會(huì)支持分片系統(tǒng)多文檔事務(wù),4.0的多文檔事務(wù)最多只面向復(fù)制集

建網(wǎng)站原本是網(wǎng)站策劃師、網(wǎng)絡(luò)程序員、網(wǎng)頁(yè)設(shè)計(jì)師等,應(yīng)用各種網(wǎng)絡(luò)程序開發(fā)技術(shù)和網(wǎng)頁(yè)設(shè)計(jì)技術(shù)配合操作的協(xié)同工作。成都創(chuàng)新互聯(lián)專業(yè)提供成都做網(wǎng)站、網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站制作(企業(yè)站、自適應(yīng)網(wǎng)站建設(shè)、電商門戶網(wǎng)站)等服務(wù),從網(wǎng)站深度策劃、搜索引擎友好度優(yōu)化到用戶體驗(yàn)的提升,我們力求做到極致!

準(zhǔn)備

集合:

use dba;
[10.240.129.36:30001_primary@dba]> db.coll_2.find()
[10.240.129.36:30001_primary@dba]> db.coll_1.find()
{ "_id" : ObjectId("5b371e120d6160b73a9fcee6"), "test" : true }
{ "_id" : ObjectId("5b371e6d0d6160b73a9fcee7"), "test" : true }

精簡(jiǎn)命令:


// 顯式開啟一個(gè)會(huì)話(難道通過shell鏈接來本身不就是會(huì)話嗎?)
session=db.getMongo().startSession()
// 顯式開啟事務(wù)
session.startTransaction()
// 獲取表對(duì)象
coll_1=session.getDatabase('dba').coll_1
coll_2=session.getDatabase('dba').coll_2;
// 使用表對(duì)象的插入函數(shù)進(jìn)行插入
coll_1.insertOne({'not_test':false})
coll_2.insertOne({'not_test':false})
// 提交事務(wù)
session.commitTransaction()
// 回滾事務(wù)
session.abortTransaction()
// 檢查事務(wù)準(zhǔn)確性
db.coll_1.find()
db.coll_2.find()

超時(shí)參數(shù)怎么設(shè)置?

默認(rèn)事務(wù)生命周期為60秒,超出后會(huì)被自動(dòng)清理

// The minimum value for transactionLifetimeLimitSeconds is 1 second.
db.adminCommand( { setParameter: 1, transactionLifetimeLimitSeconds: 30 } )
// You can also set parameter transactionLifetimeLimitSeconds at startup time.
// 可以考慮寫在配置文件中
mongod --setParameter "transactionLifetimeLimitSeconds=30"

第一次嘗試

因?yàn)橥浽O(shè)置后向兼容性,執(zhí)行失敗,在同一個(gè)shell中進(jìn)行設(shè)置后,再次插入,提示事務(wù)不存在

[10.240.129.36:30001_primary@dba]> Session.startTransactions()
2018-06-30T14:17:10.670+0800 E QUERY    [js] ReferenceError: Session is not defined :
@(shell):1:1
[10.240.129.36:30001_primary@dba]> db.getMongo()
connection to 127.0.0.1:30001
[10.240.129.36:30001_primary@dba]> db.getMongo().startSession()
session { "id" : UUID("887f4564-4f8a-4783-886d-a55a536f41aa") }
[10.240.129.36:30001_primary@dba]> session=db.getMongo().startSession()
session { "id" : UUID("9b3e10b9-93cd-4010-b1a3-0e7b49796db3") }
[10.240.129.36:30001_primary@dba]> session.startTransaction()
[10.240.129.36:30001_primary@dba]> coll_1=session.getDatabase('dba').coll_1;
dba.coll_1
[10.240.129.36:30001_primary@dba]> coll_2=session.getDatabase('dba').coll_2;
dba.coll_2
[10.240.129.36:30001_primary@dba]> coll_1.insertOne({'not_test':false})
// 后向兼容性要求為4,也就是說想開啟事務(wù)必須是mongod4以上的版本
2018-06-30T14:28:55.708+0800 E QUERY    [js] WriteCommandError: Transactions are only supported in featureCompatibilityVersion 4.0. See http://dochub.mongodb.org/core/4.0-feature-compatibility for more information. :
WriteCommandError({
    "ok" : 0,
    "errmsg" : "Transactions are only supported in featureCompatibilityVersion 4.0. See http://dochub.mongodb.org/core/4.0-feature-compatibility for more information.",
    "code" : 50773,
    "codeName" : "Location50773"
})
WriteCommandError@src/mongo/shell/bulk_api.js:420:48
Bulk/executeBatch@src/mongo/shell/bulk_api.js:902:1
Bulk/this.execute@src/mongo/shell/bulk_api.js:1150:21
DBCollection.prototype.insertOne@src/mongo/shell/crud_api.js:252:9
@(shell):1:1
[10.240.129.36:30001_primary@dba]> db.adminCommand({setFeatureCompatibilityVersion:'4.0'})
{ "ok" : 1 }

// 可以看到,報(bào)錯(cuò),重新設(shè)置版本兼容性后,原先的事務(wù)出現(xiàn)了問題
[10.240.129.36:30001_primary@dba]> coll_1.insertOne({'not_test':false})
2018-06-30T14:31:16.706+0800 E QUERY    [js] WriteCommandError: Given transaction number 0 does not match any in-progress transactions. :
WriteCommandError({
    "errorLabels" : [
        "TransientTransactionError"
    ],
    "ok" : 0,
    "errmsg" : "Given transaction number 0 does not match any in-progress transactions.",
    "code" : 251,
    "codeName" : "NoSuchTransaction"
})
WriteCommandError@src/mongo/shell/bulk_api.js:420:48
Bulk/executeBatch@src/mongo/shell/bulk_api.js:902:1
Bulk/this.execute@src/mongo/shell/bulk_api.js:1150:21
DBCollection.prototype.insertOne@src/mongo/shell/crud_api.js:252:9
@(shell):1:1

// 事務(wù)怎么也調(diào)不好了

[10.240.129.36:30001_primary@dba]> session.startTransaction()
2018-06-30T14:33:53.293+0800 E QUERY    [js] Error: Transaction already in progress on this session. :
startTransaction@src/mongo/shell/session.js:732:1
startTransaction@src/mongo/shell/session.js:925:17
@(shell):1:1
[10.240.129.36:30001_primary@dba]> db.getMongo().abortTransaction
[10.240.129.36:30001_primary@dba]> db.getMongo().abortTransaction
[10.240.129.36:30001_primary@dba]> db.getMongo().abortTransaction
[10.240.129.36:30001_primary@dba]> db.getMongo().abortTransaction
[10.240.129.36:30001_primary@dba]> db.getMongo().abortTransaction
[10.240.129.36:30001_primary@dba]>
[10.240.129.36:30001_primary@dba]> db.getMongo().abortTransaction
[10.240.129.36:30001_primary@dba]> db.getMongo().abortTransaction
[10.240.129.36:30001_primary@dba]> exit
// 直接退出當(dāng)前連接

第二次嘗試:

[10.240.129.36:30001_primary@admin]> session=db.getMongo().startSession()
session { "id" : UUID("b82d71b0-b698-4909-b5b8-a7845dba98b2") }
[10.240.129.36:30001_primary@admin]>  session.startTransaction()
[10.240.129.36:30001_primary@admin]> coll_1=session.getDatabase('dba').coll_1
dba.coll_1
[10.240.129.36:30001_primary@admin]> coll_2=session.getDatabase('dba').coll_2;
dba.coll_2
[10.240.129.36:30001_primary@admin]> coll_1.insertOne({'not_test':false})
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5b37270429c5c0c486b4b17b")
}
[10.240.129.36:30001_primary@admin]> coll_2.insertOne({'not_test':false})

// 這里的事務(wù)回滾可能是因?yàn)槌瑫r(shí)引起的,默認(rèn)事務(wù)生命周期大值為1分鐘

2018-06-30T15:00:50.629+0800 E QUERY    [js] WriteCommandError: Transaction 0 has been aborted. :
WriteCommandError({
    "errorLabels" : [
        "TransientTransactionError"
    ],
    "ok" : 0,
    "errmsg" : "Transaction 0 has been aborted.",
    "code" : 251,
    "codeName" : "NoSuchTransaction"
})
WriteCommandError@src/mongo/shell/bulk_api.js:420:48
Bulk/executeBatch@src/mongo/shell/bulk_api.js:902:1
Bulk/this.execute@src/mongo/shell/bulk_api.js:1150:21
DBCollection.prototype.insertOne@src/mongo/shell/crud_api.js:252:9
@(shell):1:1
[10.240.129.36:30001_primary@admin]> coll_2.insertOne({'not_test':false})
2018-06-30T15:00:59.308+0800 E QUERY    [js] WriteCommandError: Transaction 0 has been aborted. :
WriteCommandError({
    "errorLabels" : [
        "TransientTransactionError"
    ],
    "ok" : 0,
    "errmsg" : "Transaction 0 has been aborted.",
    "code" : 251,
    "codeName" : "NoSuchTransaction"
})
WriteCommandError@src/mongo/shell/bulk_api.js:420:48
Bulk/executeBatch@src/mongo/shell/bulk_api.js:902:1
Bulk/this.execute@src/mongo/shell/bulk_api.js:1150:21
DBCollection.prototype.insertOne@src/mongo/shell/crud_api.js:252:9
@(shell):1:1

// 事務(wù)超時(shí)回滾之后,應(yīng)該還可以重開新的事務(wù)才對(duì),這里老是報(bào)錯(cuò)

[10.240.129.36:30001_primary@admin]> session.startTransaction()
2018-06-30T15:01:04.932+0800 E QUERY    [js] Error: Transaction already in progress on this session. :
startTransaction@src/mongo/shell/session.js:732:1
startTransaction@src/mongo/shell/session.js:925:17
@(shell):1:1

// 內(nèi)部已經(jīng)回滾掉了,結(jié)果竟然需要我手動(dòng)回滾才行,暈

[10.240.129.36:30001_primary@admin]> session.abortTransaction()
[10.240.129.36:30001_primary@admin]> session.startTransaction()
[10.240.129.36:30001_primary@admin]> coll_1.insertOne({'not_test':false})
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5b372ac229c5c0c486b4b17e")
}
[10.240.129.36:30001_primary@admin]> coll_2.insertOne({'not_test':false})
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5b372ac529c5c0c486b4b17f")
}

// 試試能不能進(jìn)行explain操作

[10.240.129.36:30001_primary@admin]> coll_1.explain().find({'test_explain':1})
2018-06-30T15:03:09.375+0800 E QUERY    [js] Error: explain failed: {
    "ok" : 0,
    "errmsg" : "Cannot run 'explain' in a multi-document transaction.",
    "code" : 50767,
    "codeName" : "Location50767"
} :  // 果然是報(bào)錯(cuò)了呢,在事務(wù)中不能進(jìn)行explain操作
_getErrorWithCode@src/mongo/shell/utils.js:25:13
throwOrReturn@src/mongo/shell/explainable.js:31:1
constructor/this.finish@src/mongo/shell/explain_query.js:171:24
constructor/this.shellPrint@src/mongo/shell/explain_query.js:210:26
shellPrintHelper@src/mongo/shell/utils.js:594:1
@(shell2):1:1

// 嘗試提交時(shí)報(bào)錯(cuò)
[10.240.129.36:30001_primary@admin]> session.commitTransaction()
2018-06-30T15:04:21.985+0800 E QUERY    [js] Error: command failed: {
    "errorLabels" : [
        "TransientTransactionError"
    ],
    "ok" : 0,
    "errmsg" : "Transaction 1 has been aborted.",
    "code" : 251,
    "codeName" : "NoSuchTransaction"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
doassert@src/mongo/shell/assert.js:18:14
_assertCommandWorked@src/mongo/shell/assert.js:534:17
assert.commandWorked@src/mongo/shell/assert.js:618:16
commitTransaction@src/mongo/shell/session.js:929:17
@(shell):1:1

[10.240.129.36:30001_primary@dba]> db.coll_1.find()
{ "_id" : ObjectId("5b371e120d6160b73a9fcee6"), "test" : true }
{ "_id" : ObjectId("5b371e6d0d6160b73a9fcee7"), "test" : true }
[10.240.129.36:30001_primary@dba]> db.coll_2.find()
// 這邊可以看到,插入語(yǔ)句并沒有真正被執(zhí)行

[10.240.129.36:30001_primary@dba]> session.commitTransaction()
2018-06-30T15:05:46.288+0800 E QUERY    [js] Error: command failed: {
    "errorLabels" : [
        "TransientTransactionError"
    ],
    "ok" : 0,
    "errmsg" : "Transaction 1 has been aborted.",
    "code" : 251,
    "codeName" : "NoSuchTransaction"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
doassert@src/mongo/shell/assert.js:18:14
_assertCommandWorked@src/mongo/shell/assert.js:534:17
assert.commandWorked@src/mongo/shell/assert.js:618:16
commitTransaction@src/mongo/shell/session.js:929:17
@(shell):1:1

// 這兒又抽風(fēng)了,內(nèi)部回滾之后禁止提交操作,嘗試進(jìn)行回滾,結(jié)果說已經(jīng)提交了,不能回滾,真是暈死

[10.240.129.36:30001_primary@dba]> session.abortTransaction()
2018-06-30T15:06:04.162+0800 E QUERY    [js] Error: Cannot call abortTransaction after calling commitTransaction. :
abortTransaction@src/mongo/shell/session.js:764:1
abortTransaction@src/mongo/shell/session.js:934:17
@(shell):1:1

第三次嘗試(成功提交):

[10.240.129.36:30001_primary@admin]> session=db.getMongo().startSession()
session { "id" : UUID("e7935985-160d-4969-adfe-3bae401e155f") }
[10.240.129.36:30001_primary@admin]> session.startTransaction()
[10.240.129.36:30001_primary@admin]> coll_1=session.getDatabase('dba').coll_1
dba.coll_1
[10.240.129.36:30001_primary@admin]> coll_2=session.getDatabase('dba').coll_2;
dba.coll_2
[10.240.129.36:30001_primary@admin]> coll_1.insertOne({'not_test':false})
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5b373202d0b208b7386e9c20")
}
[10.240.129.36:30001_primary@admin]> coll_2.insertOne({'not_test':false})
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5b373202d0b208b7386e9c21")
}
[10.240.129.36:30001_primary@admin]> session.commitTransaction()
[10.240.129.36:30001_primary@admin]> use dba
switched to db dba
[10.240.129.36:30001_primary@dba]> db.coll_1.find()
{ "_id" : ObjectId("5b371e120d6160b73a9fcee6"), "test" : true }
{ "_id" : ObjectId("5b371e6d0d6160b73a9fcee7"), "test" : true }
{ "_id" : ObjectId("5b373202d0b208b7386e9c20"), "not_test" : false }
[10.240.129.36:30001_primary@dba]> db.coll_2.find()
{ "_id" : ObjectId("5b373202d0b208b7386e9c21"), "not_test" : false }

第四次嘗試(測(cè)試回滾):

[10.240.129.36:30001_primary@admin]> session=db.getMongo().startSession()
session { "id" : UUID("e7935985-160d-4969-adfe-3bae401e155f") }
[10.240.129.36:30001_primary@admin]> session.startTransaction()
[10.240.129.36:30001_primary@admin]> coll_1=session.getDatabase('dba').coll_1
dba.coll_1
[10.240.129.36:30001_primary@admin]> coll_2=session.getDatabase('dba').coll_2;
dba.coll_2
[10.240.129.36:30001_primary@admin]> coll_1.insertOne({'not_test':false})
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5b373202d0b208b7386e9c20")
}
[10.240.129.36:30001_primary@admin]> coll_2.insertOne({'not_test':false})
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5b373202d0b208b7386e9c21")
}
[10.240.129.36:30001_primary@admin]> session.commitTransaction()
[10.240.129.36:30001_primary@admin]> use dba
switched to db dba
[10.240.129.36:30001_primary@dba]> db.coll_1.find()
{ "_id" : ObjectId("5b371e120d6160b73a9fcee6"), "test" : true }
{ "_id" : ObjectId("5b371e6d0d6160b73a9fcee7"), "test" : true }
{ "_id" : ObjectId("5b373202d0b208b7386e9c20"), "not_test" : false }
[10.240.129.36:30001_primary@dba]> db.coll_2.find()
{ "_id" : ObjectId("5b373202d0b208b7386e9c21"), "not_test" : false }
[10.240.129.36:30001_primary@dba]> session=db.getMongo().startSession()
session { "id" : UUID("cc0e2d23-1766-4ea5-87a5-957efcae28ad") }
[10.240.129.36:30001_primary@dba]> session.startTransaction()
[10.240.129.36:30001_primary@dba]> coll_1=session.getDatabase('dba').coll_1
dba.coll_1
[10.240.129.36:30001_primary@dba]> coll_2=session.getDatabase('dba').coll_2;
dba.coll_2
[10.240.129.36:30001_primary@dba]> coll_1.insertOne({'not_test':false})
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5b3732f0d0b208b7386e9c22")
}
[10.240.129.36:30001_primary@dba]> coll_2.insertOne({'not_test':false})
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5b3732f1d0b208b7386e9c23")
}
[10.240.129.36:30001_primary@dba]> session.abortTransaction()
[10.240.129.36:30001_primary@dba]> db.coll_2.find()
{ "_id" : ObjectId("5b373202d0b208b7386e9c21"), "not_test" : false }
[10.240.129.36:30001_primary@dba]> db.coll_1.find()
{ "_id" : ObjectId("5b371e120d6160b73a9fcee6"), "test" : true }
{ "_id" : ObjectId("5b371e6d0d6160b73a9fcee7"), "test" : true }
{ "_id" : ObjectId("5b373202d0b208b7386e9c20"), "not_test" : false }

注意

默認(rèn)事務(wù)超時(shí)時(shí)間有點(diǎn)短,1分鐘
默認(rèn)鎖等待時(shí)間短,5毫秒
事務(wù)的操作有些繁瑣,不如RDS的 begin commit rollback方便(指SHELL操作)
一個(gè)事務(wù)的對(duì)應(yīng)的oplog不能超過16M(指BSON格式的文件大小)
顯式事務(wù)功能的開啟對(duì)WT緩存提出了新的要求。類似于IBP事務(wù)不按時(shí)提交,類似undo用于存放快照或者舊版本的東西肯定會(huì)占用大量WT的空間。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

文章名稱:【MongoDB】4.0版本事務(wù)上手測(cè)試-創(chuàng)新互聯(lián)
文章網(wǎng)址:http://bm7419.com/article10/iiggo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、網(wǎng)站改版、網(wǎng)站設(shè)計(jì)公司、電子商務(wù)、小程序開發(fā)、網(wǎng)站制作

廣告

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

商城網(wǎng)站建設(shè)