<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Gay Bird

    登高者必自卑,行遠(yuǎn)者必自邇,在這個(gè)世界上,重要的不是你正站在那里,而是你正朝什么方向移動(dòng)......

    MSSQL事務(wù)、事務(wù)隔離級(jí)別、鎖的簡(jiǎn)單總結(jié)

    一、數(shù)據(jù)庫(kù)事務(wù)
    1、事務(wù)是作為單個(gè)邏輯工作單元執(zhí)行的一系列操作。可以是一條SQL語(yǔ)句也可以是多條SQL語(yǔ)句。

    2、事務(wù)具有四個(gè)特性
       原子性:不可分隔、成則具成、敗則具敗。
       恢灤裕菏攣裨諭瓿墑保 匭朧顧 械氖 荻急3忠恢倫刺?
       隔離性:獨(dú)立的執(zhí)行互不干擾。由并發(fā)事務(wù)所作的修改必須與任何其他并發(fā)事務(wù)所作的修改隔離(另外的描述:多個(gè)事務(wù)同時(shí)進(jìn)行,它們之間應(yīng)該互不干擾.應(yīng)該防止一個(gè)事務(wù)處理其他事務(wù)也要修改的數(shù)據(jù)時(shí),不合理的存取和不完整的讀取數(shù)據(jù))
      
    3、啟動(dòng)事務(wù):使用 API 函數(shù)和 Transact-SQL 語(yǔ)句,可以按顯式、自動(dòng)提交或隱式的方式來(lái)啟動(dòng)事務(wù)。

    4、結(jié)束事務(wù):您可以使用 COMMIT(成功) 或 ROLLBACK(失敗) 語(yǔ)句,或者通過(guò) API 函數(shù)來(lái)結(jié)束事務(wù)。

    5、創(chuàng)建事務(wù)的原則:
       盡可能使事務(wù)保持簡(jiǎn)短很重要,當(dāng)事務(wù)啟動(dòng)后,數(shù)據(jù)庫(kù)管理系統(tǒng) (DBMS) 必須在事務(wù)結(jié)束之前保留很多資源、以保證事務(wù)的正確安全執(zhí)行。
       特別是在大量并發(fā)的系統(tǒng)中, 保持事務(wù)簡(jiǎn)短以減少并發(fā) 資源鎖定爭(zhēng)奪,將先得更為重要。
       1、事務(wù)處理,禁止與用戶交互,在事務(wù)開(kāi)始前完成用戶輸入。
       2、在瀏覽數(shù)據(jù)時(shí),盡量不要打開(kāi)事務(wù)
       3、盡可能使事務(wù)保持簡(jiǎn)短。
       4、考慮為只讀查詢使用快照隔離,以減少阻塞。
       5、靈活地使用更低的事務(wù)隔離級(jí)別。
       6、靈活地使用更低的游標(biāo)并發(fā)選項(xiàng),例如開(kāi)放式并發(fā)選項(xiàng)。
       7、在事務(wù)中盡量使訪問(wèn)的數(shù)據(jù)量最小。

     

    二、事務(wù)的隔離級(jí)別

    1、數(shù)據(jù)庫(kù)事務(wù)的隔離級(jí)別:四種

    隔離級(jí)別 臟讀(Dirty Read) 不可重復(fù)讀(NonRepeatable Read) 幻讀(Phantom Read)
    讀未提交(Read uncommitted) 可能 可能 可能
    讀已提交(Read committed) 不可能 可能 可能
    可重復(fù)讀(Repeatable read) 不可能 不可能 可能
    可串行化(Serializable ) 不可能 不可能 不可能

    2、數(shù)據(jù)庫(kù)一般的默認(rèn)隔離離級(jí)別是“讀已提交”,默認(rèn)的事務(wù)隔離級(jí)別下:Insert,update ,delete下的是X鎖, 會(huì)等待事務(wù)完成。通常情況下可以把隔離級(jí)別設(shè)為Read Commited,它能避免臟讀,而且有較好的并發(fā)性能。盡管它會(huì)導(dǎo)致不可重復(fù)讀、虛讀和第二類更新丟失等問(wèn)題,在可能出現(xiàn)這類問(wèn)題的個(gè)別場(chǎng)合可以由應(yīng)用程序釆用悲觀鎖或樂(lè)觀鎖來(lái)控制。


    3、SQL語(yǔ)句可以使用SET TRANSACTION ISOLATION LEVEL來(lái)設(shè)置事務(wù)的隔離級(jí)別。如:SET TRANSACTION ISOLATION LEVEL   Read Committed。若要在應(yīng)用程序中使用更嚴(yán)格或較寬松的隔離級(jí)別,可以通過(guò)使用   set transaction isolation level語(yǔ)句設(shè)置會(huì)話的隔離級(jí)別,來(lái)自定義整個(gè)會(huì)話的鎖定。  
    指定隔離級(jí)別后,sql server會(huì)話中所有select語(yǔ)句的鎖定行為都運(yùn)行于該隔離級(jí)別上,并一直保持有效直到會(huì)話終止或者將隔離級(jí)別設(shè)置為另一個(gè)級(jí)別。

    4、另外要提一點(diǎn):SQL標(biāo)準(zhǔn)對(duì)事務(wù)隔離級(jí)別的規(guī)定,是按該級(jí)別不可能發(fā)生什么問(wèn)題來(lái)確定的,不一定會(huì)發(fā)生這樣的問(wèn)題;所以,不同的數(shù)據(jù)庫(kù)對(duì)事務(wù)隔離的級(jí)別約定不一樣,比如,有的數(shù)據(jù)庫(kù)把 可重復(fù)讀級(jí)別按可串行化來(lái)對(duì)待。(lkdlhw_2000個(gè)人理解:各個(gè)數(shù)據(jù)庫(kù)應(yīng)該都遵循四種標(biāo)準(zhǔn)的事務(wù)隔離等級(jí)的定義,但是某些數(shù)據(jù)庫(kù)具體實(shí)現(xiàn)可能不存在四種,因?yàn)榇谢梢员苊獠豢芍貜?fù)讀,因此某些數(shù)據(jù)庫(kù)語(yǔ)法上支持設(shè)置事務(wù)隔離等級(jí)為不可重復(fù)讀,但實(shí)際上是串行化在起作用。也就是說(shuō)只要該級(jí)別能夠避免不可重復(fù)讀的問(wèn)題,就可以稱之為不可重復(fù)讀取級(jí)別。)

    5、該隔離級(jí)別定義一個(gè)事務(wù)必須與其他事務(wù)所進(jìn)行的資源或數(shù)據(jù)更改相隔離的程度。事務(wù)隔離級(jí)別控制:
         讀取數(shù)據(jù)時(shí)是否占用鎖以及所請(qǐng)求的鎖類型。
         占用讀取鎖的時(shí)間。
         引用其他事務(wù)修改的行的讀取操作是否:
         在該行上的排他鎖被釋放之前阻塞其他事務(wù)。
         檢索在啟動(dòng)語(yǔ)句或事務(wù)時(shí)存在的行的已提交版本。
         讀取未提交的數(shù)據(jù)修改

    三、鎖

    1、分類:從數(shù)據(jù)庫(kù)系統(tǒng)的角度來(lái)看:分為獨(dú)占鎖(即排它鎖),共享鎖和更新鎖

    2、事務(wù)使用鎖,防止其他用戶修改另外一個(gè)還沒(méi)有完成的事務(wù)中的數(shù)據(jù)。對(duì)于多用戶系統(tǒng)來(lái)說(shuō),鎖機(jī)制是必須的。SQL Server有多種鎖,允許事務(wù)鎖定不同的資源。鎖就是保護(hù)指定的資源,不被其他事務(wù)操作。SQL Server有多種鎖,允許事務(wù)鎖定不同的資源。鎖就是保護(hù)指定的資源,不被其他事務(wù)操作。為了最小化鎖的成本,SQL Server自動(dòng)地以與任務(wù)相應(yīng)等級(jí)的鎖來(lái)鎖定資源對(duì)象。鎖定比較小的對(duì)象,例如鎖定行,雖然可以提高并發(fā)性,但是卻有較高的開(kāi)支,因?yàn)槿绻i定許多行,那么需要占有更多的鎖。鎖定比較大的對(duì)象,例如鎖定表,會(huì)大大降低并發(fā)性,因?yàn)殒i定整個(gè)表就限制了其他事務(wù)訪問(wèn)該表的其他部分,但是成本開(kāi)支比較低,因?yàn)橹恍杈S護(hù)比較少的鎖。

    3、 鎖的特點(diǎn):
    1. 鎖是保證并發(fā)控制的手段
    2. 可以鎖定的資源包括行、頁(yè)、簇、表和數(shù)據(jù)庫(kù)
    3. 鎖的類型主要包括共享鎖和排它鎖
    4. 特殊類型的鎖包括意圖鎖、修改鎖和模式鎖
    5. 共享鎖允許其他事務(wù)繼續(xù)使用鎖定的資源
    6. 排它鎖只允許一個(gè)事務(wù)訪問(wèn)數(shù)據(jù)
    7. 系統(tǒng)本身可以處理死鎖
    8. 用戶可以根據(jù)實(shí)際情況定制鎖的一些特征

    4、鎖是定義到sql語(yǔ)句上的,對(duì)數(shù)據(jù)進(jìn)行操作的sql就是:select,Insert,update ,delete。不同的事物隔離即被在執(zhí)行sql的時(shí)候會(huì)向表上發(fā)送不同的鎖。

    關(guān)于鎖的更多描述,可以去網(wǎng)上搜索一下。http://www.bitscn.com/windows/sql/200604/1068.html

    四、多個(gè)用戶同時(shí)對(duì)數(shù)據(jù)庫(kù)的并發(fā)操作時(shí)會(huì)帶來(lái)以下數(shù)據(jù)不一致的問(wèn)題:

    臟讀dirty reads:
       當(dāng)事務(wù)讀取還未被提交的數(shù)據(jù)時(shí),就會(huì)發(fā)生這種事件。舉例來(lái)說(shuō):Transaction1修改了一行數(shù)據(jù),然后Transaction2在Transaction1還未提交修改操作之前讀取了被修改的行。如果Transaction1回滾了修改操作,那么Transaction2讀取的數(shù)據(jù)就可以看作是從未存在過(guò)的。
    不可重復(fù)的讀non-repeatable reads:
       當(dāng)事務(wù)兩次讀取同一行數(shù)據(jù),但每次得到的數(shù)據(jù)都不一樣時(shí),就會(huì)發(fā)生這種事件。舉例來(lái)說(shuō):Transaction1讀取一行數(shù)據(jù),然后Transaction2修改或刪除該行并提交修改操作。當(dāng)Transaction1試圖重新讀取該行時(shí),它就會(huì)得到不同的數(shù)據(jù)值(如果該行被更新)或發(fā)現(xiàn)該行不再存在(如果該行被刪除)。    
    虛讀phantom read:
       如果符合搜索條件的一行數(shù)據(jù)在后面的讀取操作中出現(xiàn),但該行數(shù)據(jù)卻不屬于最初的數(shù)據(jù),就會(huì)發(fā)生這種事件。舉例來(lái)說(shuō)Transactio1讀取滿足某種搜索條件的一些行,然后Transaction2插入了符合Transaction1的搜索條件的一個(gè)新行。如果Transaction1重新執(zhí)行產(chǎn)生原來(lái)那些行的查詢,就會(huì)得到不同的行。

    為了解決這些問(wèn)題,數(shù)據(jù)庫(kù)引入了“鎖”的機(jī)制(從數(shù)據(jù)庫(kù)系統(tǒng)的角度來(lái)看:分為獨(dú)占鎖(即排它鎖),共享鎖和更新鎖,詳細(xì)內(nèi)容不再描述)。

     

    五、lkdlhw_2000個(gè)人理解(以下問(wèn)題都是推測(cè),還沒(méi)有證實(shí)):

    隔離級(jí)別是由鎖來(lái)實(shí)現(xiàn)的,之所以出現(xiàn)事務(wù)的隔離級(jí)別相當(dāng)于數(shù)據(jù)庫(kù)開(kāi)發(fā)商根據(jù)一般的業(yè)務(wù)需求實(shí)現(xiàn)定義好的一組鎖使用的規(guī)則,便于我們時(shí)候,當(dāng)我們將事務(wù)隔離級(jí)別定義到某一級(jí)上后如果不能滿足需求,我們還可以自行定義sql的鎖來(lái)覆蓋事務(wù)隔離級(jí)別默認(rèn)的鎖機(jī)制?

    鎖存在兩個(gè)問(wèn)題:一個(gè)是鎖的粒度,一個(gè)是鎖的時(shí)間,鎖的時(shí)間應(yīng)該包括兩種一種是sql執(zhí)行完就釋放鎖,領(lǐng)一中是事務(wù)結(jié)束后釋放鎖

    六、參考文章

    http://www.es-ivision.com/Channel-4-10-108-0.html
    http://tech.ccidnet.com/art/1105/20050602/261573_1.html
    http://www.tkk7.com/zhengtengfeng/archive/2007/04/23/113025.html

    七、事務(wù)隔離級(jí)別的例子

    1. Read Uncommitted:最低等級(jí)的事務(wù)隔離,僅僅保證了讀取過(guò)程中不會(huì)讀取到非法數(shù)據(jù)。上訴4種不確定情況均有可能發(fā)生。
    2. Read Committed:大多數(shù)主流數(shù)據(jù)庫(kù)的默認(rèn)事務(wù)等級(jí),保證了一個(gè)事務(wù)不會(huì)讀到另一個(gè)并行事務(wù)已修改但未提交的數(shù)據(jù),避免了“臟讀取”。該級(jí)別適用于大多數(shù)系統(tǒng)。
    第一個(gè)查詢事務(wù)
    SET TRANSACTION ISOLATION LEVEL   Read Committed
    begin tran
       update Cate SET Sname=Sname+'b' where ID=1
       SELECT * FROM cate where ID=1
       waitfor delay '00:00:6'  
       rollback tran --回滾事務(wù)
    select Getdate()
    SELECT * FROM cate where ID=1
    第二個(gè)查詢事務(wù)
    SET TRANSACTION ISOLATION LEVEL Read committed   --把committed換成Read uncommitted可看到“臟讀取”的示例。
    SELECT * FROM cate where ID=1
    select Getdate()
    可以看到使用 Read Committed 成功的避免了“臟讀取”.
    3. Repeatable Read:保證了一個(gè)事務(wù)不會(huì)修改已經(jīng)由另一個(gè)事務(wù)讀取但未提交(回滾)的數(shù)據(jù)。避免了“臟讀取”和“不可重復(fù)讀取”的情況,但是帶來(lái)了更多的性能損失。
    第一個(gè)查詢事務(wù)
    SET TRANSACTION ISOLATION LEVEL Repeatable Read --   把Repeatable Read換成Read committed可以看到“不可重復(fù)讀取”的示例
    begin tran
    SELECT * FROM cate where ID=33 --第一次讀取數(shù)據(jù)
       waitfor delay '00:00:6'  
    SELECT * FROM cate where ID=33 --第二次讀取數(shù)據(jù),不可重復(fù)讀取
    commit
    第二個(gè)查詢事務(wù)
    SET TRANSACTION ISOLATION LEVEL Read committed
    update cate set Sname=Sname+'JD' where ID=33
    SELECT * FROM cate where ID>30
    4. Serializable:最高等級(jí)的事務(wù)隔離,上面3種不確定情況都將被規(guī)避。這個(gè)級(jí)別將模擬事務(wù)的串行執(zhí)行。
    在第一個(gè)查詢窗口執(zhí)行
    SET TRANSACTION ISOLATION LEVEL Serializable -- 把Serializable換成Repeatable Read 可看到“幻像讀”的示例
    begin tran
    SELECT * FROM cate where ID>30 --第一次讀取數(shù)據(jù),“幻像讀”的示例
       waitfor delay '00:00:6'   --延遲6秒讀取
    SELECT * FROM cate where ID>30 --第一次讀取數(shù)據(jù)
    commit
    第二個(gè)查詢事務(wù)
    SET TRANSACTION ISOLATION LEVEL Read committed
    Delete from cate where ID>33
    SELECT * FROM cate where ID>30
    創(chuàng)建事務(wù)

    設(shè)置事務(wù)級(jí)別:SET TRANSACTION ISOLATION LEVEL
    開(kāi)始事務(wù):begin tran
    提交事務(wù):COMMIT
    回滾事務(wù):ROLLBACK
    創(chuàng)建事務(wù)保存點(diǎn):SAVE TRANSACTION savepoint_name
    回滾到事務(wù)點(diǎn):ROLLBACK TRANSACTION savepoint_name



    1、并發(fā)的影響:http://technet.microsoft.com/zh-cn/library/ms190805.aspx
          該文章列出了并發(fā)引起的四種影響:丟失更新、臟讀(未提交的依賴關(guān)系)、不可重復(fù)讀(不一致的分析)、幻讀
      
    2、并發(fā)控制類型:http://technet.microsoft.com/zh-cn/library/ms189132.aspx
         當(dāng)許多人試圖同時(shí)修改數(shù)據(jù)庫(kù)中的數(shù)據(jù)時(shí),必須實(shí)現(xiàn)一個(gè)控制系統(tǒng),使一個(gè)人所做的修改不會(huì)對(duì)他人所做的修改產(chǎn)生負(fù)面影響。這稱為并發(fā)控制。并發(fā)控制類型分為兩大類:樂(lè)觀并發(fā)控制和悲觀并發(fā)控制
      
    3、數(shù)據(jù)庫(kù)引擎中的隔離級(jí)別:http://technet.microsoft.com/zh-cn/library/ms189122.aspx
         1)講到了事務(wù)隔離級(jí)別控制的內(nèi)容:
               事務(wù)隔離級(jí)別控制:
              讀取數(shù)據(jù)時(shí)是否占用鎖以及所請(qǐng)求的鎖類型。
              占用讀取鎖的時(shí)間。
              引用其他事務(wù)修改的行的讀取操作是否:
                     在該行上的排他鎖被釋放之前阻塞其他事務(wù)。
                    檢索在啟動(dòng)語(yǔ)句或事務(wù)時(shí)存在的行的已提交版本。
                     讀取未提交的數(shù)據(jù)修改。
          2)列出了事務(wù)的隔離級(jí)別:
            未提交讀(隔離事務(wù)的最低級(jí)別,只能保證不讀取物理上損壞的數(shù)據(jù))
             已提交讀(數(shù)據(jù)庫(kù)引擎的默認(rèn)級(jí)別)
             可重復(fù)讀
             可序列化(隔離事務(wù)的最高級(jí)別,事務(wù)之間完全隔離)

         3)選擇事務(wù)隔離級(jí)別不影響為保護(hù)數(shù)據(jù)修改而獲取的鎖。事務(wù)總是在其修改的任何數(shù)據(jù)上獲取排他鎖并在事務(wù)完成之前持有該鎖,不管為該事務(wù)設(shè)置了什么樣的隔離級(jí)別。對(duì)于讀取操作,事務(wù)隔離級(jí)別主要定義保護(hù)級(jí)別,以防受到其他事務(wù)所做更改的影響。
      
    4、SET TRANSACTION ISOLATION LEVEL (Transact-SQL) 設(shè)置事務(wù)隔離級(jí)別http://technet.microsoft.com/zh-cn/library/ms173763.aspx
         該選項(xiàng)的作用與在事務(wù)內(nèi)所有 SELECT 語(yǔ)句中的所有表上設(shè)置 HOLDLOCK 相同
    5、總結(jié):
         通過(guò)以上幾篇文章基本上可以了解數(shù)據(jù)庫(kù)事務(wù)和鎖之間的關(guān)系。數(shù)據(jù)庫(kù)事務(wù)隔級(jí)別也是由鎖機(jī)制來(lái)最實(shí)現(xiàn)的。要想了解關(guān)于鎖的更深層析的內(nèi)容還需要專門學(xué)習(xí)鎖的相關(guān)知識(shí)。

    posted on 2008-10-11 13:11 Sky Yi 閱讀(5555) 評(píng)論(1)  編輯  收藏

    Feedback

    # re: MSSQL事務(wù)、事務(wù)隔離級(jí)別、鎖的簡(jiǎn)單總結(jié) 2008-12-29 09:27 iask

    “2、事務(wù)具有四個(gè)特性”里面有亂碼  回復(fù)  更多評(píng)論   



    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲AV综合色一区二区三区| 亚洲人成无码网WWW| 久久精品国产亚洲AV麻豆王友容 | 美女免费视频一区二区三区| 久久久久久AV无码免费网站下载| 亚洲国产成人久久笫一页| 亚洲成在人线在线播放无码| 黄页网站在线看免费| 亚洲国产精品成人精品小说 | 国产精品高清视亚洲一区二区| 蜜臀AV免费一区二区三区| 亚洲avav天堂av在线不卡| 视频免费在线观看| 亚洲精品高清国产一线久久| 久久er国产精品免费观看8| 亚洲Aⅴ无码一区二区二三区软件| 蜜臀亚洲AV无码精品国产午夜.| 真实乱视频国产免费观看| 亚洲综合激情五月色一区| 在线播放高清国语自产拍免费| 亚洲欧美乱色情图片| 日本免费一区二区三区最新| 美女18毛片免费视频| 亚洲不卡AV影片在线播放| 国产精品免费久久久久影院| 亚洲无线码在线一区观看| 在线观看免费视频一区| 亚洲美女又黄又爽在线观看| 久久国产乱子伦免费精品| 亚洲另类图片另类电影| 99精品全国免费观看视频| 亚洲精品久久无码| jizzjizz亚洲| 永久免费AV无码网站国产| 亚洲精品不卡视频| 毛片免费在线视频| 偷自拍亚洲视频在线观看| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 久久免费视频网站| 亚洲香蕉久久一区二区三区四区| 大学生a级毛片免费观看|