分佈式事務簡介

    學過數據庫理論的都知道事務的感念,簡單點說就是一系列操作要麼全做,要麼全不做。我常舉的一個例子就是要把甲賬戶轉賬1000元到乙賬戶,至少要做兩步操作,首先從甲賬戶減1000元,然後在乙賬戶加1000元,這個轉賬要麼兩步都做,要麼都不做,這就是一個事務的概念。絕對不允許出現甲賬戶減了1000元,乙賬戶沒變化這樣的情況。
    有些時候,一個事務會在多個數據庫之間進行。例如上面那個例子,甲賬戶數據存在A數據庫中,乙賬戶數據存在B數據庫中,要完成這個事務就需要在A數據庫和B數據庫中進行,這樣跨越多個數據庫的事務就是分佈式事務。
    分佈式事務(Distributed Transaction Processing,DTP)與我們通常所用的單數據庫事務有所不同,要複雜一些,主要過程就是兩階段提交:第一階段是預提交,也就是把對數據庫的操作提交各數據庫,詢問各數據庫這樣的操作能不能提交,各數據庫則作出迴應;第二階段是提交或者回滾,根據第一階段各數據庫的應答結果,作出提交或回滾決定,在這裏對於各數據庫的應答結果是一票否決的,只要有一個數據庫迴應不能提交,則整個事務回滾,全部數據庫都可以提交時,整個事務纔可以提交,然後通知各數據庫提交或者回滾操作。
    如何處理分佈式事務,也有相關規範存在,Open Group的X/Open XA規範就是對分佈式事務的操作模型、接口進行定義的,影響非常大。在Java裏面,有JTA(Java Transaction API)規範,但也遵守了X/Open XA規範,爲相關產品和開發提供標準。
    在分佈式事務裏面,主要有5種角色:
    1、應用程序。利用分佈式事務的接口提供分佈式事務的應用。
    2、應用服務器。是應用程序的容器,需要知道分佈式事務的狀態。
    3、事務管理器。對分佈式事務進行管理,如開啓、提交、回滾事務。
    4、資源管理器。提供應用程序對資源的訪問,執行事務中的部分操作,主要是數據庫、消息隊列等資源,需要支持兩階段提交。
    5、通信資源管理器。對事務的狀況進行傳播,主要是消息中間件。
    對於分佈式事務,有不少組件可用,如java裏的EJB、開源組件AtomikosTransactionsEssentials、JOTM等,微軟的MTS。在需要分佈式事務的應用裏面,把這些組件集成進去就可以提供分佈式事務的支持了。
    由於分佈式事務涉及的資源更多,執行的步驟更復雜,需要更多的資源、時間來完成一個事務,對應用程序的性能會有所影響。出於性能方面的考慮,能夠不使用分佈式事務就不用,如果確實需要用,也有很多組件可以選擇。
發佈了35 篇原創文章 · 獲贊 1 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章