數(shù)據(jù)庫事務(wù)簡介

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

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

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

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

               隔離級別     臟讀        不可重復(fù)讀     幻讀
               Serializable     不會             不會     不會
               REPEATABLE READ     不會             不會       會
               READ COMMITTED     不會               會       會
               Read Uncommitted       會               會       會
            
          數(shù)據(jù)庫采用鎖機制來實現(xiàn)事務(wù)的隔離性。

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

          常見的并發(fā)控制鎖

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

          引用:


          樂觀鎖

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

          悲觀鎖

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

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

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

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 安庆市| 绵竹市| 揭西县| 和静县| 景泰县| 石林| 通州市| 克拉玛依市| 抚松县| 东乌| 民乐县| 临西县| 新干县| 时尚| 卓资县| 香港 | 铁力市| 嘉义县| 长汀县| 垦利县| 田林县| 屏山县| 林州市| 张家港市| 平顺县| 延安市| 日土县| 新和县| 苏尼特右旗| 弋阳县| 郓城县| 峨山| 微山县| 八宿县| 阳城县| 巴里| 丹巴县| 永济市| 泉州市| 梅州市| 延边|