成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

MySQL和MongoDB中多文檔事務(wù)支持扥功能的對(duì)比

本篇內(nèi)容介紹了“MySQL和MongoDB中多文檔事務(wù)支持扥功能的對(duì)比”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)是專業(yè)的東光網(wǎng)站建設(shè)公司,東光接單;提供成都網(wǎng)站建設(shè)、網(wǎng)站制作,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行東光網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

MongoDB  4.0已經(jīng)發(fā)布GA版本,并且有許多新功能和改進(jìn)。在本文中,我們將重點(diǎn)關(guān)注主要功能,毫無疑問,這是對(duì)多文檔ACID事務(wù)的支持。我們將圍繞隔離級(jí)別、可重復(fù)讀、幻讀、事務(wù)沖突檢測(cè)等主要功能,通過實(shí)驗(yàn)與MySQL一一做對(duì)比。

MySQL和MongoDB中多文檔事務(wù)支持扥功能的對(duì)比

MySQL和MongoDB中多文檔事務(wù)支持扥功能的對(duì)比

首先會(huì)簡(jiǎn)述介紹下ACID事務(wù)隔離級(jí)別,然后再步入測(cè)試主題正文。

原子性(Atomicity):事務(wù)包含的所有操作要么全部成功,要么全部失敗,不存在成功一半的概念。典型例子“西方二元對(duì)立思想——非此即彼”:在二元邏輯體系中只存在兩種邏輯值,就是對(duì)和錯(cuò),或正和負(fù),不存在既對(duì)又錯(cuò)或非正非負(fù)的其他狀態(tài)。

一致性(Consistency):一個(gè)事務(wù)執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)。典型例子:“金龍,你借我5000元,下個(gè)月開支給你?!辈徽摻瘕堄檬裁捶绞浇o我轉(zhuǎn)賬,分幾次轉(zhuǎn),借錢結(jié)束后我銀行卡里的余額增加5000元,金龍卡里少了5000元,不能突然蹦出來1萬來。

隔離性(Isolation):數(shù)據(jù)庫采用鎖機(jī)制來實(shí)現(xiàn)事務(wù)的隔離性,當(dāng)多個(gè)事務(wù)同時(shí)更新數(shù)據(jù)庫中相同的數(shù)據(jù)時(shí),只允許持有鎖的事務(wù)能更新該數(shù)據(jù),其他事務(wù)必須等待,直到前一個(gè)事務(wù)釋放了鎖,其他事務(wù)才有機(jī)會(huì)更新該數(shù)據(jù)。典型例子:“你去醫(yī)院看病,要先到護(hù)士那里分診排號(hào),如果多個(gè)患者加塞兒同時(shí)進(jìn)來,大夫就發(fā)飆了,出去排隊(duì),只能一個(gè)一個(gè)看”。

持久性(Durability):事務(wù)成功提交后,它對(duì)數(shù)據(jù)庫所做的修改就***保存下來,即使數(shù)據(jù)庫崩潰,數(shù)據(jù)還能恢復(fù)到事務(wù)成功提交后的狀態(tài)。典型例子:“你去ATM機(jī)取錢,結(jié)果ATM機(jī)故障了,你取出來了錢,卡里的余額不能沒減?!?/p>

一、局限性與限制條件

1、多文檔事務(wù)僅適用于副本集。

注:如果是單機(jī),需切到副本集模式。

2、僅適用于WiredTiger存儲(chǔ)引擎。

3、如果你的架構(gòu)是分片Sharding模式,事務(wù)是不支持的。分布式事務(wù)計(jì)劃在4.2版本里支持。

4、事務(wù)只支持CRUD操作,DDL、DCL操作不支持。

注:CRUD就是MySQL的DML,意思一樣叫法不同而已。

5、事務(wù)無法在config、admin和local系統(tǒng)數(shù)據(jù)庫中讀取或?qū)懭搿?/p>

MySQL和MongoDB中多文檔事務(wù)支持扥功能的對(duì)比

6、事務(wù)無法在system.*(系統(tǒng)集合)里寫入。

7、不能有大事務(wù)寫入,寫入集不能超過16MB(類似MariaDB Galera  Cluster寫入集wsrep_max_ws_size限制),否則客戶端直接報(bào)錯(cuò)。

注:如果有大事務(wù),應(yīng)該考慮將這些大事務(wù)拆分成若干塊較小的事務(wù)。例如將大于2018年的狀態(tài)值更改為1,應(yīng)考慮循環(huán)1萬條一批量更新,這一點(diǎn)跟MySQL玩法一樣。

二、我們***個(gè)事務(wù)

在開始事務(wù)之前,必須創(chuàng)建會(huì)話。事務(wù)不能在會(huì)話外運(yùn)行。

var session1 = db.getMongo().startSession()  var session2 = db.getMongo().startSession()

Mongo Shell里引入了三個(gè)用于創(chuàng)建,提交和終止事務(wù)的新命令:

session.startTransaction()

在當(dāng)前會(huì)話中啟動(dòng)事務(wù)

session.commitTransaction()

持久保存事務(wù)中的操作變更

session.abortTransaction()

終止事務(wù)操作所做的變更

MySQL和MongoDB中多文檔事務(wù)支持扥功能的對(duì)比

1、在test庫創(chuàng)建t1表,并且插入4條數(shù)據(jù)。

MySQL和MongoDB中多文檔事務(wù)支持扥功能的對(duì)比

演示一

MySQL和MongoDB中多文檔事務(wù)支持扥功能的對(duì)比

演示二

MySQL和MongoDB中多文檔事務(wù)支持扥功能的對(duì)比

空閑事務(wù)受transactionLifetimeLimitSeconds參數(shù)影響,默認(rèn)60秒。

可通過以下命令查看:

db.adminCommand( { getParameter: 1, transactionLifetimeLimitSeconds: 1 } )

如果你想在線變更,可以通過下面的命令設(shè)置:

db.adminCommand( { setParameter: 1, transactionLifetimeLimitSeconds: 30 } )

也可以寫死在/etc/mongod.cnf配置文件里***生效,格式如下:

setParameter = transactionLifetimeLimitSeconds=30

注:空閑事務(wù)是指當(dāng)一個(gè)事務(wù)長(zhǎng)時(shí)間未提交,那么這個(gè)連接就不能關(guān)閉,內(nèi)存就不釋放,并發(fā)一大,導(dǎo)致DB連接數(shù)增多,就會(huì)對(duì)性能產(chǎn)生影響。默認(rèn)是60秒,你可以根據(jù)自己的情況設(shè)定閾值。超過這個(gè)閾值,服務(wù)端自動(dòng)殺死未提交的空閑事務(wù)。

MySQL和MongoDB中多文檔事務(wù)支持扥功能的對(duì)比

三、事務(wù)隔離性演示

演示一:事務(wù)沖突檢測(cè)

MySQL和MongoDB中多文檔事務(wù)支持扥功能的對(duì)比

當(dāng)兩個(gè)(或多個(gè))并發(fā)事務(wù)修改相同的文檔時(shí),會(huì)發(fā)生沖突。即使在尚未提交事務(wù)時(shí),MongoDB也可以立即檢測(cè)到?jīng)_突。

這里和MySQL有些區(qū)別,MySQL可以通過參數(shù)innodb_lock_wait_timeout設(shè)置檢測(cè)到事務(wù)沖突后,自動(dòng)終止回滾的時(shí)間,而MongoDB沒有提供該參數(shù)。

當(dāng)在執(zhí)行創(chuàng)建索引時(shí),未加{background:1})后臺(tái)創(chuàng)建。

此時(shí)新事務(wù)將無法獲取所需的鎖,并且在等待參數(shù)maxTransactionLockRequestTimeoutMillis后事務(wù)終止回滾,默認(rèn)值是5毫秒。

MySQL和MongoDB中多文檔事務(wù)支持扥功能的對(duì)比

如果你想在線調(diào)整事務(wù)等待獲取鎖的時(shí)間,可以通過下面的命令設(shè)置:

db.adminCommand( { setParameter: 1, maxTransactionLockRequestTimeoutMillis: 15 } )

也可以寫死在/etc/mongod.cnf配置文件里***生效,格式如下:

setParameter = maxTransactionLockRequestTimeoutMillis=15

演示二:可重復(fù)讀

MySQL和MongoDB中多文檔事務(wù)支持扥功能的對(duì)比

Repeatable Read (可重復(fù)讀)可避免臟讀、不可重復(fù)讀的發(fā)生。

不可重復(fù)讀側(cè)重點(diǎn)在于更新修改的數(shù)據(jù),即在同一個(gè)事務(wù)里,兩次查詢的數(shù)據(jù)結(jié)果不一致。與臟讀的區(qū)別是:臟讀是一個(gè)事務(wù)讀取了另一個(gè)事務(wù)未提交的臟數(shù)據(jù)。

演示三:幻讀

MySQL和MongoDB中多文檔事務(wù)支持扥功能的對(duì)比

在MySQL默認(rèn)隔離級(jí)Repeatable Read下,剛才的操作,在會(huì)話二未提交的事務(wù)里,會(huì)莫名其妙地看到第5條數(shù)據(jù),這種現(xiàn)象稱為幻讀。

幻讀和不可重復(fù)讀很像,但幻讀側(cè)重點(diǎn)在于新增和刪除,而不可重復(fù)讀側(cè)重點(diǎn)在于更改,共同之處都是一個(gè)事務(wù)中兩次查詢得到的數(shù)據(jù)結(jié)果不一致。

由此,從測(cè)試結(jié)果得出的結(jié)論是:

MongoDB采用的默認(rèn)隔離級(jí)別是Snapshot一致性快照(特別是設(shè)置了readConcern=majority情況下,要讀某行數(shù)據(jù)的歷史版本時(shí),依賴該隔離級(jí)別。)

Snapshot介于Repeatable  Read與Serializable之間,既避免了臟讀、不可重復(fù)讀、幻讀,又不會(huì)因Serializable串行化降低并發(fā)性能。

MySQL和MongoDB中多文檔事務(wù)支持扥功能的對(duì)比

“MySQL和MongoDB中多文檔事務(wù)支持扥功能的對(duì)比”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

當(dāng)前名稱:MySQL和MongoDB中多文檔事務(wù)支持扥功能的對(duì)比
網(wǎng)站網(wǎng)址:http://jinyejixie.com/article4/ijgdie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、域名注冊(cè)網(wǎng)站改版、App開發(fā)、網(wǎng)站收錄、動(dòng)態(tài)網(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)

外貿(mào)網(wǎng)站建設(shè)
泰来县| 新沂市| 汉寿县| 岳阳县| 马尔康县| 麻阳| 沙雅县| 衡阳市| 深圳市| 兴宁市| 荆州市| 永登县| 金堂县| 吉木萨尔县| 泰州市| 乐至县| 维西| 永春县| 宁强县| 德惠市| 商南县| 容城县| 永丰县| 普安县| 托克逊县| 北安市| 阿城市| 安徽省| 溧水县| 康平县| 乌兰县| 灵武市| 黄梅县| 榆社县| 历史| 白银市| 晋宁县| 桂平市| 阳谷县| 阿拉善盟| 射阳县|