成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL PK MongoDB:多文檔事務(wù)支持,誰更友好?

數(shù)據(jù)庫(kù) MySQL 其他數(shù)據(jù)庫(kù) MongoDB
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ì)比。

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ì)比。 

 

 

首先會(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è)月開支給你。”不論金龍用什么方式給我轉(zhuǎn)賬,分幾次轉(zhuǎn),借錢結(jié)束后我銀行卡里的余額增加5000元,金龍卡里少了5000元,不能突然蹦出來1萬來。

隔離性(Isolation):數(shù)據(jù)庫(kù)采用鎖機(jī)制來實(shí)現(xiàn)事務(wù)的隔離性,當(dāng)多個(gè)事務(wù)同時(shí)更新數(shù)據(jù)庫(kù)中相同的數(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ù)庫(kù)所做的修改就***保存下來,即使數(shù)據(jù)庫(kù)崩潰,數(shù)據(jù)還能恢復(fù)到事務(wù)成功提交后的狀態(tài)。典型例子:“你去ATM機(jī)取錢,結(jié)果ATM機(jī)故障了,你取出來了錢,卡里的余額不能沒減。”

一、局限性與限制條件

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ù)庫(kù)中讀取或?qū)懭搿?nbsp;

 

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)行。 

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

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

  1. session.startTransaction() 

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

  1. session.commitTransaction() 

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

  1. session.abortTransaction() 

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

 

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

 

演示一

 

演示二 

 

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

可通過以下命令查看:

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

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

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

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

  1. 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ù)。 

 

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

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

 

當(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毫秒。 

 

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

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

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

  1. setParameter = maxTransactionLockRequestTimeoutMillis=15 

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

 

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

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

演示三:幻讀 

 

在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ā)性能。 

 

參考文獻(xiàn)

  • https://docs.mongodb.com/manual/core/transactions/
  • https://www.percona.com/blog/2018/12/04/mongodb-4-0-using-acid-multi-document-transactions/ 
責(zé)任編輯:龐桂玉 來源: DBAplus社群
相關(guān)推薦

2018-07-05 10:55:25

數(shù)據(jù)庫(kù)MongoDB 4.0多文檔事務(wù)

2018-03-01 14:58:55

MongoDB數(shù)據(jù)庫(kù)NoSQL

2010-08-06 09:58:16

云計(jì)算

2011-05-11 14:50:54

URL

2011-08-08 15:05:16

2016-11-04 13:00:55

Asynces6Javascript

2021-12-21 21:58:24

數(shù)字故宮小程序

2014-01-09 10:40:38

Cocos3.0 Be觸控

2010-04-23 22:06:13

機(jī)房監(jiān)控軟件Mocha BSM摩卡軟件

2009-07-10 08:53:18

ChromeWindows 7性能比較

2015-05-14 18:37:05

小米

2018-06-29 15:12:32

Go語言Node.js語言

2022-05-23 09:11:18

AngularBlazor前端

2011-07-12 09:18:39

2019-03-01 09:36:25

ReactAngular開發(fā)

2018-06-14 14:45:51

MySQLOracle文檔存儲(chǔ)

2016-10-13 07:17:53

科技新聞早報(bào)微軟谷歌

2013-09-02 08:40:46

家用路由器橫評(píng)

2020-02-02 15:42:22

PythonC++編程語言

2013-03-13 09:36:56

PC清理工具Windows8
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美一区二区三区在线 | 在线成人免费视频 | 国产一区久久精品 | 在线欧美一区 | 二区亚洲 | 中文字幕蜜臀 | 国产精品久久久久久久久久久免费看 | 欧美另类视频在线 | 成人国产精品久久 | 久久日本 | www国产成人免费观看视频,深夜成人网 | 春色av| 国内精品久久影院 | 久久国产精品一区二区三区 | 久草免费电影 | 久久久.com | 毛片免费看 | 伊人久久精品 | 亚洲欧美综合 | 91在线网站 | 日本久久黄色 | 久久国产视频一区 | 亚洲免费一区二区 | 日韩在线播放网址 | 蜜臀av日日欢夜夜爽一区 | 日韩1区| 999精品视频 | 久久国产精品亚洲 | 最新超碰| 观看毛片 | 亚洲男人网 | 久久一二| 国产欧美一区二区三区在线看 | 欧美精品91 | 日韩一区欧美一区 | 一区二区欧美在线 | 久久久精品网站 | 夜夜爽99久久国产综合精品女不卡 | 天天干天天干 | 国产欧美一区二区三区国产幕精品 | 91资源在线 |