Mongodb系列——Mongodb事務
mongodb事務html
1. 事務基礎概念
1.1. 什麼是事務和ACID
- 事務就是經過一系列操做來完成一件事情,在進行這些操做的過程當中,要麼這些操做徹底執行,要麼這些操做全不執行,不存在中間狀態,事務分爲事務執行階段和事務提交階段。通常說到事務,就會想到它的特性— ACID,那麼什麼是 ACID 呢?咱們先用一個現實中的例子來講明:AB 兩同窗帳號都有 1,000 塊錢,A 經過銀行轉帳向 B 轉了 100,這個事務分爲兩個操做,即從 A 同窗帳號扣除 100,向 B 同窗帳號增長 100。
- 原子性(Atomicity)
- 組成事務的系列操做是一個總體,要麼全執行,要麼不執行。經過上面例子就是從 A 同窗扣除錢和向 B 同窗增長 100 是一塊兒發生的,不可能出現扣除了 A 的錢,但沒增長 B 的錢的狀況。
- 一致性(Consistency):
- 在事務開始以前和事務結束之後,數據庫的完整性和狀態沒有被破壞。這個怎麼理解呢?就是 A、B 兩人在轉帳錢的總和是 2,000,轉帳後兩人的總和也必須是 2,000。不會由於此次轉帳事務破壞這個狀態。
- 隔離性(Isolation):
- 多個事務在併發執行時,事務執行的中間狀態是其餘事務不可訪問的。A 轉出 100 但事務沒有確認提交,這時候銀行人員對其帳號查詢時,看到的應該仍是 1,000,不是 900。
- 持久性(Durability)
- 事務一旦提交生效,其結果將永久保存,不受任何故障影響。A 轉帳一但完成,那麼 A 就是 900,B 就是 1,100,這個結果將永遠保存在銀行的數據庫中,直到他們下次交易事務的發生。
1.2. 事務引起的問題
-
讀可寫node
-
髒讀git
- 指當一個事務正在訪問數據,而且對數據進行了修改,而這種修改尚未提交到數據庫中,這時,另一個事務也訪問這個數據,而後使用了這個數據。由於這個數據是尚未提交的數據, 那麼另一個事務讀到的這個數據是髒數據,依據髒數據所作的操做多是不正確的。
- 幻讀
- 指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的數據進行了修改,這種修改涉及到表中的所有數據行。同時,第二個事務也修改這個表中的數據,這種修改是向表中插入一行新數據。那麼,之後就會發生操做第一個事務的用戶發現表中還有沒有修改的數據行,就好象發生了幻覺同樣。
- 不可重複讀
- 指在一個事務內,屢次讀同一數據。在這個事務尚未結束時,另一個事務也訪問該同一數據。那麼,在第一個事務中的兩次讀數據之間,因爲第二個事務的修改,那麼第一個事務兩次讀到的數據多是不同的。這樣就發生了在一個事務內兩次讀到的數據是不同的,所以稱爲是不可重複讀。
- http://www.tuicool.com/articles/uYrMFv
2. mongodb的事務介紹
2.1. mongodb新的引擎
- 雖然WT實現了多操做事務模型,然而MongoDB並無提供事務,這或許和MongoDB自己的架構和產品定位有關係。
- 可是MongoDB利用了WT的短事務的隔離性實現了文檔級行鎖 ,對MongoDB來講這是大大的進步。mongodb能夠實現事務可是不提供給用戶,這和mongodb的定位有關係
- 擴展閱讀
2.2. mongodb實現事物
- 在單個文檔等級上,MongoDB支持ACID。更準確的說,默認狀況下是「ACI」,打開「j」WriteConcern選項後是ACID。
- Mongo有豐富的查詢語言,橫跨多個文檔,所以人們一直在尋找多文檔事務來使用他們的SQL代碼。
- 多文檔操做不支持事務
- 一個常見的辦法是利用文檔的性質:不須要不少行、不少關係,你能夠將全部的東西嵌入到一個大文檔中,Denormalization將帶你迴歸事務。
2.3. 事務實現方式
2.3.1. 理論
- mongodb就是不支持事物,那麼就不要作涉及事務的操做
- github實現
- 五個解決方案讓MongoDB擁有RDBMS的魯棒性事務:
2.3.2. 實戰
3. mongodb的行內鎖
4. 其餘,mongodb教程
歡迎關注本站公眾號,獲取更多信息