[分布式]事务处理的常见方法
處理事務的常見方法有排隊法、排他鎖、讀寫鎖、MVCC等方式。
排隊法
??????? 事務處理中最重要也是最簡單的方案是排隊法,單線程地處理一堆數據。
在Redis中,如果數據全部在內存中,那么單線程處理所有Put、Get操作效率最高。原因在于多線程的本質是CPU模擬多個線程,這種模擬是以上下文切換為代價,這種上下文切換是需要額外開銷的,而對于內存的數據庫來說,沒有上下文切換時效率最高。因此,單個CPU綁定一塊內存的數據,針對這塊數據做多次讀寫操作時都是在單個CPU上完成的,單線程處理方式在內存的情況是效率是最優的。
??????? 那么什么時候事務需要用到多線程呢?這個問題的本質取決于下層所使用的存儲,如果是內存操作,則可以動態地申請和銷毀內存塊;而磁盤的IOPS很低,但吞吐量很高。
??????? 如果一個場景涉及多次讀寫操作,單線程可以很高的效率對于內存進行讀寫操作;但是,由于磁盤的IOPS僅為內存的幾千分之
一,如果依舊用操作內存的方式操作磁盤,那系統的整體性能將會很低,這意味著必須將大量的讀寫操作聚合成一個Batch后再提交
時才能達到較好的性能。而將大量請求攢到一起的方式一是異步,也就是請求本身和線程不綁定,線程可以不Block(本質來說還是
一種多線程的方式),處理完一個線程后再處理其他線程。這種做法的核心是將大量不同的請求提交到一個Buffer中,再由該Buffer
統一讀取或者寫入磁盤,從而提高效率。在慢速設備中,多線程或異步非常常見,在設計系統時,面對磁盤、網絡、SSD等慢速設
備必須考慮使用多線程。
排它鎖
??????? 有些場景不適合用單線程操作,可以利用排他鎖的方式來快速隔離并發讀寫事務。
??????? 若事務T對數據對象A加上X鎖,則只允許T讀取和修改A,其他任何事務都不能再對A加任何類型的鎖,直到T釋放A上的鎖。這就保證了其他事務在T釋放A上的鎖之前不能再讀取和修改A。
讀寫鎖
??????? 數據庫中有一些事務單元是共享的,如果是一個只讀的事務,例如只對數據進行查詢操作,在該過程中數據一定不被修改,因此多個查詢操作可以并行執行,因此一種針對讀讀場景的優化自然而然產生——讀寫鎖。讀寫鎖的核心是在多次讀的操作中,同時允許多個讀者來訪問共享資源,提高并發性。
MVCC
??????? 在最初的數據庫事務實現中是不存在MVCC的,它是Oracle在八十年代新加的功能,本質是Copy On Write,也就是每次寫都是以重新開始一個新的版本的方式寫入數據,因此,數據庫中也就包含了之前的所有版本。在數據讀的過程中,先申請一個版本號,如果該版本號小于正在寫入的版本號,則數據一定可以查詢到,無需等到新版本完全寫完即可返回查詢結果。這種方式可以在讀讀不阻塞的前提下,實現讀寫/寫讀不阻塞,盡可能保證所有的讀操作并行,而寫操作串行。
總結
以上是生活随笔為你收集整理的[分布式]事务处理的常见方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hadoop Hive概念学习系列之hi
- 下一篇: centos7安装dhcp服务器并由客户