數據庫事務簡介

          事務就是一系列的操作,這些操作完成一項任務.只要這些操作里有一個操作沒有成功,事務就操作失敗,發生回滾事件.即撤消前面的操作,這樣可以保證數據的一致性.而且可以把操作暫時放在緩存里,等所有操作都成功有提交數據庫,這樣保證費時的操作都是有效操作.
          如果沒有特殊聲明,事務就是指數據庫事務簡單的講就是對數據庫表的添加、刪除、修改和查詢操作。
          從編程的角度來說事務可由程序員來設置,(何時開啟,何時提交,何時回滾)如果沒有設置則按數據庫默認自動劃分事務。而事務最終在數據庫上執行.所以要求數據庫支持事務。

          事務具有四個特征:原子性( Atomicity )、一致性( Consistency )、隔離性( Isolation )和持續性( Durability )。這四個特性簡稱為 ACID 特性。
          1 、原子性
              事務是數據庫的邏輯工作單位,事務中包含的各操作要么都做,要么都不做
          2 、一致性 
              事務執行的結果必須是使數據庫從一個一致性狀態變到另一個一致性狀態。因此當數據庫只包含成功事務提交的結果時,就說數據庫處于一致性狀態。如果數據庫系統 運行中發生故障,有些事務尚未完成就被迫中斷,這些未完成事務對數據庫所做的修改有一部分已寫入物理數據庫,這時數據庫就處于一種不正確的狀態,或者說是 不一致的狀態。 
          3 、隔離性
              一個事務的執行不能其它事務干擾。即一個事務內部的操作及使用的數據對其它并發事務是隔離的,并發執行的各個事務之間不能互相干擾。
          4 、持續性
             也稱永久性,指一個事務一旦提交,它對數據庫中的數據的改變就應該是永久性的。接下來的其它操作或故障不應該對其執行結果有任何影響。
            
          數據庫系統是允許多個用戶共享數據庫資源,尤其是多個用戶可以同時存取相同數據。(多用戶同時對一個表操作也就是并發)
          我們主觀上雖不想這么做,可是這種情況是存在的,沒有原因。而并發會破壞事務ACID特性 (隔離性,一致性)。

          并發會帶來下列問題:
           臟讀:一個事務讀取了未提交的事務
           不可重復讀:同一個事務中多次讀取同一個數據返回的結果不同
           幻讀:一個事務讀取到了另一個事務已提交的insert數據。
           
          如果應用程序使用完全隔離的事務,那么同時執行多個事務的效果將與串行執行(一個接一個的順序執行)完全等效。為解決事務之間的并發帶來的個問題,必須在事務之間建立隔離關系(使用隔離級別)。

          事務的隔離級別:就是對事務并發控制的等級,ANSI/ISO SQL將其分為串行化(SERIALIZABLE)、可重復讀(REPEATABLE READ)、讀已提交(READ COMMITED)、讀未提交(READ UNCOMMITED)四個等級
              1 Serializable:最嚴格的級別,事務串行執行,資源消耗最大;
              2 REPEATABLE READ:讀取數據的事務允許其他事務繼續訪問該行數據,但是未提交的寫事務將會禁止其他事務訪問該行。避免了“臟讀取”和“不可重復讀取”的情況,但是帶來了更多的性能損失。
              3 READ COMMITTED:大多數主流數據庫的默認事務等級,保證了一個事務不會讀到另一個并行事務已修改但未提交的數據,避免了“臟讀取”。該級別適用于大多數系統。
              4 Read Uncommitted:最低的事務隔離級別,保證了讀取過程中不會讀取到非法數據。

               隔離級別     臟讀        不可重復讀     幻讀
               Serializable     不會             不會     不會
               REPEATABLE READ     不會             不會       會
               READ COMMITTED     不會               會       會
               Read Uncommitted       會               會       會
            
          數據庫采用鎖機制來實現事務的隔離性。

           共享鎖:共享鎖用于讀取數據操作,它允許其他事務同時讀取某鎖定的資源,但不允許其他事務更新它。
           排他鎖:排它鎖用于修改數據的場合。它鎖定的資源,其他事務不能讀取也不能修改。
           更新鎖:更新鎖在更新操作的初始化階段用來鎖定可能要被修改的資源,從而避免使用共享鎖造成的死鎖現象

          常見的并發控制鎖

          http://hahalzb.blogbus.com/logs/19150842.html   心晴怡然

          引用:


          樂觀鎖

          處理并發更新的一種方式是使用樂觀鎖(optimistic locking)。樂觀鎖的工作原理是讓應用程序檢查它即將更新的數據是否已被另一個事務修改(自該數據上次讀取以來)。實現樂觀鎖的一種常見做法是在每個表里添加一個版本字段,每次應用程序更新數據表記錄時就增加這個版本字段。每個UPDATE語句中的WHERE子句會根據上次讀取的值來判斷這個版本號是否改變。通過查看PreparedStatement.executeUpdate()返回的記錄數,應用程序可以判斷UPDATE語句是否成功。如果這條記錄已被另一個事務更新或刪除,應用程序可以回滾這個事務,并重新開始。
          在直接執行SQL語句的應用程序中,樂觀鎖機制的實現非常容易。不過,使用諸如JDO和Hibernate的持久層構架時,實現更為容易,因為它們已將樂觀鎖作為配置選項提供。一旦啟用該配置選項,持久層框架會自動生成SQL UPDATE語句,執行版本檢查。第12章將分析樂觀鎖的使用時機及其缺點,并向你展示怎樣在iBATIS、JDO和Hibernate中使用樂觀鎖。
          樂觀鎖的名稱源自如下假定情況,即并發更新的幾率極小,此外應用程序并不阻止并發更新,而是檢測并發更新,并從并發更新中恢復過來。另一種方式是使用悲觀鎖(pessimistic locking),它假定并發更新將會發生,因此必須預先阻止。

          悲觀鎖

          不同于樂觀鎖的另一種方式是使用悲觀鎖。當讀取某些記錄時,事務先鎖住這些記錄,這樣可以防止其他事務訪問這些數據記錄。具體細節要視數據庫而定,不過糟糕的是,并非所有數據庫都支持悲觀鎖。如果數據庫支持悲觀鎖,在直接執行SQL語句的應用程序中,實現悲觀鎖非常
          容易。然而,正如你所預料的,在JDO或Hibernate應用程序中使用悲觀鎖更為容易。JDO以配置選項的方式提供悲觀鎖,而Hibernate則提供一個簡單實用的API,來鎖定對象。同樣,在第12章,你將學習何時使用悲觀鎖,分析其缺點,并看看怎樣在iBATIS、JDO和Hibernate中使用悲觀鎖。

          posted on 2009-11-11 17:23 AK47 閱讀(990) 評論(0)  編輯  收藏 所屬分類: 數據庫

          <2009年11月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導航

          統計

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 嘉兴市| 台北县| 嘉鱼县| 兰西县| 页游| 和静县| 东台市| 增城市| 扶绥县| 砚山县| 巴林左旗| 陆河县| 米泉市| 正宁县| 紫云| 绿春县| 宣汉县| 平原县| 洪湖市| 金坛市| 晋州市| 贞丰县| 双流县| 灌云县| 曲靖市| 弋阳县| 新乐市| 宜州市| 平和县| 高陵县| 博白县| 突泉县| 钟祥市| 南木林县| 莱州市| 巴中市| 六枝特区| 旬阳县| 达孜县| 合阳县| 香格里拉县|