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