<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 【第九章】 Spring的事務 之 9.1 數據庫事務概述 ——跟我學spring3 ## 9.1? 數據庫事務概述 事務首先是一系列操作組成的工作單元,該工作單元內的操作是不可分割的,即要么所有操作都做,要么所有操作都不做,這就是事務。 事務必需滿足ACID(原子性、一致性、隔離性和持久性)特性,缺一不可: * **原子性(Atomicity):**即事務是不可分割的最小工作單元,事務內的操作要么全做,要么全不做; * **一致性(Consistency):**在事務執行前數據庫的數據處于正確的狀態,而事務執行完成后數據庫的數據還是處于正確的狀態,即數據完整性約束沒有被破壞;如銀行轉帳,A轉帳給B,必須保證A的錢一定轉給B,一定不會出現A的錢轉了但B沒收到,否則數據庫的數據就處于不一致(不正確)的狀態。 * **隔離性(Isolation):**并發事務執行之間無影響,在一個事務內部的操作對其他事務是不產生影響,這需要事務隔離級別來指定隔離性; * **持久性(Durability):**事務一旦執行成功,它對數據庫的數據的改變必須是永久的,不會因比如遇到系統故障或斷電造成數據不一致或丟失。 在實際項目開發中數據庫操作一般都是并發執行的,即有多個事務并發執行,并發執行就可能遇到問題,目前常見的問題如下: * 丟失更新:兩個事務同時更新一行數據,最后一個事務的更新會覆蓋掉第一個事務的更新,從而導致第一個事務更新的數據丟失,這是由于沒有加鎖造成的; * 臟讀:一個事務看到了另一個事務未提交的更新數據; * 不可重復讀:在同一事務中,多次讀取同一數據卻返回不同的結果;也就是有其他事務更改了這些數據; * 幻讀:一個事務在執行過程中讀取到了另一個事務已提交的插入數據;即在第一個事務開始時讀取到一批數據,但此后另一個事務又插入了新數據并提交,此時第一個事務又讀取這批數據但發現多了一條,即好像發生幻覺一樣。 為了解決這些并發問題,需要通過數據庫隔離級別來解決,在標準SQL規范中定義了四種隔離級別: * **未提交讀(Read Uncommitted)**:最低隔離級別,一個事務能讀取到別的事務未提交的更新數據,很不安全,可能出現丟失更新、臟讀、不可重復讀、幻讀; * **提交讀(Read Committed)**:一個事務能讀取到別的事務提交的更新數據,不能看到未提交的更新數據,不可能可能出現丟失更新、臟讀,但可能出現不可重復讀、幻讀; * **可重復讀(Repeatable Read)**:保證同一事務中先后執行的多次查詢將返回同一結果,不受其他事務影響,可能可能出現丟失更新、臟讀、不可重復讀,但可能出現幻讀; * **序列化(Serializable)**:最高隔離級別,不允許事務并發執行,而必須串行化執行,最安全,不可能出現更新、臟讀、不可重復讀、幻讀。 隔離級別越高,數據庫事務并發執行性能越差,能處理的操作越少。因此在實際項目開發中為了考慮并發性能一般使用**提交讀**隔離級別,它能避免丟失更新和臟讀,盡管不可重復讀和幻讀不能避免,但可以在可能出現的場合使用**悲觀鎖或樂觀鎖**來解決這些問題。 ### 9.1.1? 事務類型 數據庫事務類型有本地事務和分布式事務: * 本地事務:就是普通事務,能保證單臺數據庫上的操作的ACID,被限定在一臺數據庫上; * 分布式事務:涉及兩個或多個數據庫源的事務,即跨越多臺同類或異類數據庫的事務(由每臺數據庫的本地事務組成的),分布式事務旨在保證這些本地事務的所有操作的ACID,使事務可以跨越多臺數據庫; Java事務類型有JDBC事務和JTA事務: * JDBC事務:就是數據庫事務類型中的本地事務,通過Connection對象的控制來管理事務; * JTA事務:JTA指Java事務API(Java Transaction API),是Java EE數據庫事務規范, JTA只提供了事務管理接口,由應用程序服務器廠商(如WebSphere Application Server)提供實現,JTA事務比JDBC更強大,支持分布式事務。 Java EE事務類型有本地事務和全局事務: * 本地事務:使用JDBC編程實現事務; * 全局事務:由應用程序服務器提供,使用JTA事務; 按是否通過編程實現事務有聲明式事務和編程式事務; * 聲明式事務: 通過注解或XML配置文件指定事務信息; * 編程式事務:通過編寫代碼實現事務。 ### 9.1.2? Spring提供的事務管理 Spring框架最核心功能之一就是事務管理,而且提供一致的事務管理抽象,這能幫助我們: * 提供一致的編程式事務管理API,不管使用Spring JDBC框架還是集成第三方框架使用該API進行事務編程; * 無侵入式的聲明式事務支持。 Spring支持聲明式事務和編程式事務事務類型。 原創內容,轉載請注明出處【[http://sishuok.com/forum/blogPost/list/0/2502.html](http://sishuok.com/forum/blogPost/list/0/2502.html#7220)】
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看