本地事務和分佈式事務工做實踐 【轉】

  • 一:從事務的歷史提及html

      知已知彼,百戰不敗。想了解事務,咱們從事務的歷史提及。html5

      在Windows平臺上,事務的概念最開始出如今關係型數據庫中,可是隨着.net平臺的發展,事務包括的的範圍也愈來愈寬,先一睹爲快,數據庫

      在關係型數據庫中的事務是經過begin transaction,rollback transaction, commit 等關鍵字來實現事務的。bootstrap

     

    BEGIN TRANSACTION  
    UPDATE [dbo].[T_ACCOUNT] SET BALANCE = BALANCE + @amount WHERE ID = @toAccount  
    IF @@ERROR <> 0   
    BEGIN 
        ROLLBACK TRANSACTION  
    END 
    ELSE
        COMMIT TRANSACTION

     

      隨着面象對象的發展,.net的誕生,在.net 1.* 的版本中,能夠經過ADO.NET來實現數據庫的事務。把事務交給業務程序來控制,使業務程序的本職發揮的淋漓盡致,而從數據庫的角度來看,數據庫也能更專注的進行數據的存儲。達到了各盡其責的效果。c#

     

    using (DbTransaction transaction = connection.BeginTransaction())
     {
        command.Transaction = transaction;
         try
        {
            command.ExecuteNonQuery();
            transaction.Commit();
        }
        catch (Exception ex)
        {
            transaction.Rollback();
            throw new Exception(ex.Message);
        }
    }

     

      萬物是發展的,程序的發展也是永無止境的。某天有一個需求:建立一個客戶信息,其中包括姓名和頭像。姓名保存在數據庫,頭像保存在服務器的硬盤中。姓名和頭像的保存有一個失敗都是一個不完整的操做,都要回滾到初始狀態。用ADO.NET的事務顯示不能實現這個要求。由於回滾資源包括了數據庫硬盤。基於這種狀況,.net 2.0推出了System.Transactions事務。跨域

    using (TransactionScope transactionScope = new TransactionScope())
    {
        bankService.Pay("111", 50);
        bankService.Receipt("222", 50);
         transactionScope.Complete();
    }

      System.Transactions名稱空間下的事務,是.net的主推事務。安全

    二:事務有關概念服務器

      第一節,咱們都用代碼把事務實踐了一把,那還有必要來講事務的概念和事務在運行過程當中涉及到的對象呢?若是你想深刻了解事務,這一步是必須的。網絡

         事務的定義和屬性:mybatis

      1,什麼是事務:它是一個操做序列,這些操做要麼都執行,要麼都不執行,它是一個不可分割的工做單位。

      2,事務特性:接觸事務,都是從事務的ACID開始,原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。每一個特性的定義僵硬,枯燥,不易理解,讀了好幾篇都有讓人想跳樓的慾望。今兒換一個方式來講事務特性。

      銀行轉款是事務的經典示例,可能由於錢與銀行扯的上關係,一提到銀行,你們都精神倍爽,爲了避免另類,因此我也決定用銀行轉款來講事務的四大特性。

      2.1:原子性:銀行轉款分爲"轉出"和"接收"兩步,好比給異地結婚的朋友送禮金,本身的錢已經轉出去了,可是朋友沒有收到禮金,這時你們都心急如焚。因此轉款必需要保證"轉出"和"接收"要麼都成功,要麼都不成功。這就是轉款的原子性。

      2.2:一致性:給朋友轉款888元RMB做爲婚禮的禮金,可是朋友只收到777元RMB。這時你不爽了,你朋友也不爽,因此轉款要必須保證數據的一致性。

      2.3:隔離性:轉款分爲"轉出"和"接收"兩步,理論上是能夠同時進行的,可是在實際生活中確有時間差,即便相差0.0001秒,在這段時間裏,本身的帳戶和朋友的帳戶都不能進行查詢操做,即便查詢了,也是處於一種等待狀態。在這期間外界沒法對數據進行查詢訪問,因此稱之爲隔離性。

      2.4:持久性:轉款這個操做被銀行記錄起來,過不少年後,你都還能查詢到轉款這個記錄。這就是持久性。

       事務涉及的對象:

      1,資源:應用程序存儲和獲取數據的地方,能夠是數據庫,文件,也能夠是內存。若是是應用程序的事務塊代碼中涉及到的數據庫,文件,內存,那這些資源就稱爲事務型資源

      2,資源管理器:在事務模型中,應用不是直接訪問資源,而是經過中間介訪問資源,這個中間介就叫資源管理器。資源分爲可持久化資源(對應了持久化資源管理),易失資源(對應了易失資源管理器)。

      3,事務管理器:實現事務的開始,提交,回滾。

      事務提高:

      要認識事務提高,必需要弄清楚事務管理器的類型。以下做了很是詳細的介紹:

      1:輕量級事務管理器:做用於開啓事務的應用程序域,只能包含一個持久化資源,若是再添加一個持久化資源,將被輕量級事務管理器忽略。可是能夠登記多個易失資源。目前輕量級事務管理器只支持SQL 2005以及SQL2005以上的版本持久化資源。

      3:內核事務管理器:在Vista被引入,並後續於Windows Server 2008,WIN7。引入內核事務管理器主要是把文件管理(NTFS文件系統)和註冊表管理歸入事務範疇。咱們將那些支持事務的文件系統和註冊表叫做事務型文件系統(TxF)和事務型註冊表(TxR)。 之因此稱爲內核事務管理器,是因它運行在內核模式上,而不是在用戶模式上。一樣內核事務管理器只支持一個持久化資源。

      3:分佈式事務協調器:每一臺電腦上只有一個分佈式事務協調器,它管理了當前計算機的全部事務資源。它能夠跨程序域,跨進程,跨機器,跨網絡來執行事務。當事務跨機器時,每臺機器的分佈式事務協調器按照相應的協議工做,實現對整個事務的管理,它對應的事務管理協議有Ole-Tx和WS-Atomic Transaction(WS-AT)這些。 分佈式事務協調器可以管理一個分佈式事務涉及的全部事務型資源,無論具體的事務型資源分佈在何處。

      事務提高:事務是一個動態執行的操做序列,在整個過程當中,不可能預知資源的登記狀況。因此輕量級事務管理器做爲默認的事務管理器,隨着事務的逐步執行,若是涉及到內核事務資源,那麼將提高爲內核事務管理器。若是出現對多個事務資源的訪問,或者當前事務涉及跨域(調用另一個服務),就會提高爲分佈式事務協調器。Windows採用事務提高機制進行事務管理器的選擇。

      

    三:事務的分類

      1:本地事務

      輕量級事務管理器,內核事務管理器都只支持本地事務。本地事務相對簡單,這兒不做重點簡述。

      2:分佈式事務

      理解分佈式事務是怎樣實現的,事務提交樹是關鍵。

      事務提交樹:事務提交樹的根是事務初始化服務所在的機器的DTC,它在整個事務提交過程當中充當着總協調者,又被稱爲全局提交協調器。資源管理器充當着事務提交樹的葉子節點,它們的父結點爲本機的DTC,分佈於不一樣機器的DTC按照事務的傳播路徑造成了上下級關係。

      

      在一個分佈式事務中,事務的初始化和提交是屬於一個對象,只有最初開始的事務才能被提交,咱們將這種能被初始化和提交的事務稱做可提交事務。隨着參與者逐個登記到事務中,它們本地的事務實際上依賴着這個最初開始的事務,因此咱們稱這種事務叫依賴事務。

    四:示例

  • 咱們若是是仔細閱讀這篇文章不難發現他提供了一個.exe類型文件的下載。先把這個TxF2007_07.exe文件下載到本地硬盤,執行它,能夠獲得一個關於 c#的 KtmIntegration.csproj 的項目,咱們用visual studio來打開這個項目,而且從新重成這個項目,能夠獲得一個KtmIntegration.dll文件。在你要實現的文件事務的項目中引入這個.dll文件,那你就能夠很順利的實現文件事務的操做了。具體代碼:

     

    using System;
    using System.IO;
    using System.Transactions;
    using Microsoft.KtmIntegration;
    
    namespace Exercise.WebLocalTransaction
    {
        public partial class Test02 : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                using (TransactionScope transactionScope = new TransactionScope())
                {
                    try
                    {
                        FileStream stream = TransactedFile.Open(
                            @"D:/Sam Xiao.txt"
                            , FileMode.OpenOrCreate
                            , FileAccess.ReadWrite
                            , FileShare.ReadWrite);
                        StreamWriter writer = new StreamWriter(stream);
                        writer.WriteLine(String.Concat("執行一個事務代碼:",DateTime.Now.ToString(),Environment.NewLine));
                        writer.Close();
                        //int x = 0;
                        //int y = 10;
                        //int z = y / x;
                        transactionScope.Complete();
                    }
                    catch
                    {
    
                    }
                }
            }
        }
    }

     

    不要忘記了引入using Microsoft.KtmIntegration;名稱空間。在段代碼沒有異常的狀況下,咱們能夠看到D盤裏順利建立了一個關於Sam Xiao.txt的文件。咱們故意在這段代碼中拋出一個被0整除的異常,那麼整個操做就會回滾。

      分佈式事務

      在.net平臺上,主要是經過WCF的手段來實現程序的分佈式開發。在WCF事務體系:主要解決了事務在服務中的流轉,以及解決服務內部直接或間接訪問事務型資源的協做。

      用WCF來演示事務的時候,要選擇好WCF的綁定類型,有一部份綁定是不支持WCF的事務傳播的。咱們選擇wsHttpBinding 來作WCF的事務演示。

      1,首先定義好WCF的服務契約

     

    [ServiceContract(Name = "IBankingService")]
    public interface IBankingService
    {
          
        [TransactionFlow(TransactionFlowOption.Mandatory)]
        [OperationContract(Name = "Transfer")]
        void Transfer(string fromAccountId, string toAccountId, double amount);
    
        [TransactionFlow(TransactionFlowOption.Mandatory)]
        [OperationContract(Name = "Pay")]
        bool Pay(String accountID, double amount);
    
        [TransactionFlow(TransactionFlowOption.Mandatory)]
        [OperationContract(Name = "Receipt")]
        bool Receipt(String accountID, double amount);
    }

     

      2,實現WCF的服務

     

    [ServiceBehavior(TransactionIsolationLevel = System.Transactions.IsolationLevel.Serializable)]
    public class BankingService : IBankingService
    {
        [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
        public void Transfer(string fromAccountId, string toAccountId, double amount)
        {
            throw new NotImplementedException();
        }
    
        [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
        public bool Pay(string accountID, double amount)
        {
            throw new NotImplementedException();
        }
    
        [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
        public bool Receipt(string accountID, double amount)
        {
            throw new NotImplementedException();
        }
    }

     

      3,WCF宿主配置

     

    <system.serviceModel>
          <behaviors>
              <serviceBehaviors>
                  <behavior name="sBehaviorConfig">
                      <serviceMetadata httpGetEnabled="true" />
                      <serviceDebug includeExceptionDetailInFaults="true" />
                  </behavior>
              </serviceBehaviors>
          </behaviors>
    
          <bindings>
            <wsHttpBinding>
              <binding name="wshttpConfig" transactionFlow="true" >
                <security mode="None" />
              </binding>
            </wsHttpBinding>
          </bindings>
          
          <services>
            <service name="Exercise.Service.BankingService" behaviorConfiguration="sBehaviorConfig">
              <endpoint address="mex"  binding="wsHttpBinding" bindingConfiguration="wshttpConfig" contract="Exercise.Contract.IBankingService"></endpoint>
            </service>
          </services>
          <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
        </system.serviceModel>

     

      4,WCF客戶端配置

     

    <system.serviceModel>
        <bindings>
          <wsHttpBinding>
            <binding name="WSHttpBinding_IBankingService" transactionFlow="true">
              <security mode="None" />
            </binding>
          </wsHttpBinding>
        </bindings>
        <client>
          <endpoint address="http://localhost:9100/BankingService.svc/mex"
              binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IBankingService"
              contract="Exercise.Contract.IBankingService" name="WSHttpBinding_IBankingService" />
        </client>
      </system.serviceModel>

     

      5,調用服務

     

     

    IBankingService bankService = WcfProxy.CreateProxy<IBankingService>("WSHttpBinding_IBankingService");
    protected void Page_Load(object sender, EventArgs e)
    {
        using (TransactionScope transactionScope = new TransactionScope())
        {
            bankService.Pay("111", 50);
            bankService.Receipt("222", 50);
            transactionScope.Complete();
        }
    }

     

    1. 1. 使用阿里巴巴Druid鏈接池(高效、功能強大、可擴展性好的數據庫鏈接池、監控數據庫訪問性能、支持Common-Logging、Log4j和JdkLog,監控數據庫訪問)
    1.  

      2. 提供高併發JMS消息處理機制
      3. 全部功能模塊化、全部模塊服務化、全部服務原子化的方式,提供可拓展的服務模型,使程序穩定運行,永不宕機
      4. 提供Wink Rest、Webservice服務,故可做爲獨立服務平臺部署

      框架整合:

      Springmvc + Mybatis + Shiro(權限) + REST(服務) + WebService(服務) + JMS(消息) + Lucene(搜搜引擎) + Quartz(定時調度) + Bootstrap Html5(支持PC、IOS、Android)

      框架簡介:

     

    項目Maven構建,真實大型互聯網架構,作到高併發,大數據處理,整個項目使用定製化服務思想,提供模塊化、服務化、原子化的方案,將功能模塊進行拆分,能夠公用到全部的項目中。架構採用分佈式部署架構,全部模塊進行拆分,使項目作到絕對解耦,穩定壓倒一切~~

     

    持續集成:

    1. 個人待辦工做流服務(提供Webservice服務)

    2. 個人待辦工做流集成JMS消息服務(支持高併發,可支持成千上萬系統集成)

    3. 個人任務提供Rest服務,完成平常的工做管理,經過定時調度平臺,動態生成個人任務、循環週期任務、定時郵催提醒完成任務等

    4. 文件上傳、多線程下載服務化、發送郵件、短信服務化、部門信息服務化、產品信息服務化、信息發佈服務化、個人訂閱服務化、個人任務服務化、公共連接、個人收藏服務化等

    系統模塊:

     1.  用戶管理:

          用戶信息管理(添加、刪除、修改、用戶受權、用戶欄目管理、查詢等)

          用戶組管理(添加、刪除、修改、用戶組欄目受權,欄目受權、查詢、用戶組人員添加查詢等)

          用戶角色管理(添加、刪除、修改、用戶角色受權、用戶角色欄目信息查詢設置等)
     2.  文章管理:

          欄目管理:查詢無限極欄目樹、建立無限極欄目樹分類(導航欄目、圖片列表欄目、文章列表欄目、文章內容欄目等)、刪除、修改欄目信息。

          文章管理:建立、刪除、修改文章,多維度文章查詢,包括已發佈、未發佈、全部文章等。文章富文本編輯器、文章多文件上傳、文章狀態控制等。
    3.  系統設置:

           數據字典管理:支持中、英文信息,支持無限級別分類配置,動態控制是否可用等。

           部門信息管理:支持中、英文無限級別部門信息增長,刪除,修改操做,部門列表、樹心查詢等。

           日誌管理:系統日誌列表查詢、在線查看、在線下載等

           路線管理:集成百度地圖API,提供線路查詢管理功能

           Druid Monitor(監控):集成阿里巴巴鏈接池,提供在線鏈接池監控程序,包括:數據源、SQL監控、URL監控、Session監控、Spring監控等

           網站信息管理:經過系統配置文件進行網站內容操做,包括郵件服務器配置、公司基本信息配置等。

     4.  集成REST服務,能夠用做獨立服務平臺(提供大量實例及測試平臺,包括:文件上傳下載、郵件短信發送、部門、產品、公共鏈接、個人收藏、個人任務、信息發佈等)

     5.  集成Quartz調度,能夠用做定時調度平臺(動態配置調度類、調度時間,使程序自動執行某些業務)

     6.  Lucene搜索引擎,能夠將文件資料索引化,支持文件內容搜索、關鍵字搜索、高亮關鍵字等,使信息在毫秒內提取查詢出來

     7.  用戶設置功能:包括修改用戶信息,修改密碼、發送消息,修改我的圖片,查看角色、查看用戶組,管理員修改角色、用戶、用戶組等。

     8.  集成Webservice平臺,包括jaxws服務、CXF框架,配置雙加密的權限認證。使服務集成更加安全。

     9.  Bootstrap html5提供了兩套前臺開環境,包括CMS和電子商務網站,使您的開發更加的簡潔。

    技術點:

    1.  Springmvc + Mybatis集成、SpringSecurity權限控制、Spring AOP事務處理。

    2.   Wink Rest服務、Webservice服務:jaxws、CXF等

    3.  IO 流上傳下載文件,多線程操做

    4.  發送郵件,配置郵件服務器,發基於html、純文本格式的郵件

    5.  MD5加密 (登錄密碼校驗加密等),用戶統一Session、Cookie管理,統一驗證碼校驗等。

    6.  數據庫鏈接池統一配置 

    7.  Quartz定時調度任務集成(直接經過配置便可)

    8.  Httpclient破解驗證碼,登錄聯通充值平臺

    9.  漢字、英文拆分、能夠用做文檔關鍵字搜索等。

    10.  Base64圖片處理,支持PC,Android,IOS

    11.  Service Socket 、Client Socket 通訊技術(已經作過GPRS數據獲取,並用到了項目中)

    12.  提供大量工具類,能夠直接使用

    13.  Maven項目構建,您能夠直接作架構,能夠提高本身的學習能力,使您成爲真正的架構師。

    Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

    Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

  • Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

    Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

    Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

    Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

    Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

     Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

    Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

    Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

    Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

    Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

    Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

    Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客
     

    Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

    Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

     Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

     Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

相關文章
相關標籤/搜索