亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

SQL點滴9—SQL Server中的事務(wù)處理以及SSIS中的

系統(tǒng) 2097 0
原文: SQL點滴9—SQL Server中的事務(wù)處理以及SSIS中的內(nèi)建事務(wù)

我們可以把SSIS中的整個package包含在一個事務(wù)中,但是如果在package的執(zhí)行過程中有一個表需要鎖定應(yīng)該怎么處理呢?SSIS內(nèi)建的事務(wù)處理可以解決這個問題。在此之前首先來熟悉一下SQL Server中的事務(wù)的概念。

?

事務(wù)

SQL Server中的事務(wù)是單個的工作單元。如果某一事務(wù)成功,則在該事務(wù)中進(jìn)行的所有數(shù)據(jù)修改均會提交,成為數(shù)據(jù)庫中永久的組成部分。如果事務(wù)遇到錯誤且必須取消或回滾,則所有的數(shù)據(jù)修改均被清除。

在SQL Server中使用事務(wù)有可能會造成一些預(yù)想不到的結(jié)果,具體來說有臟讀,不可重復(fù)讀和幻讀三種結(jié)果。

  • 臟讀 :臟讀是指當(dāng)一個事務(wù)正在訪問數(shù)據(jù)庫,并且對數(shù)據(jù)進(jìn)行修改,而這種修改還沒有提交到數(shù)據(jù)庫中,另外一個事務(wù)也在訪問這個數(shù)據(jù),然后使用了這個數(shù)據(jù)。
  • 不可重復(fù)讀 :在一個事物內(nèi)多次讀同一數(shù)據(jù)。在這個事務(wù)還沒有結(jié)束時,另外一個事物也在訪問該同一數(shù)據(jù),那么在第一個事務(wù)兩次讀取之間,由于第二個事務(wù)的修改,第一個事務(wù)兩次讀取到的數(shù)據(jù)可能不一樣。這樣就發(fā)生了在一個事務(wù)內(nèi)兩次讀取到的數(shù)據(jù)不一樣,因此稱為不可重復(fù)讀。
  • 幻讀 :幻讀是指當(dāng)事務(wù)不是獨(dú)立執(zhí)行時發(fā)生的一種現(xiàn)象,例如第一個事務(wù)對一個表中的數(shù)據(jù)進(jìn)行修改,這種修改設(shè)計到表中的全部數(shù)據(jù)行。同時第二個事務(wù)也修改這個表中的數(shù)據(jù),這個修改時向同一個表中插入一行新數(shù)據(jù),這樣第一個事務(wù)的用戶發(fā)現(xiàn)還有一條數(shù)據(jù)沒有修改,像發(fā)生了幻覺一樣,因此稱為幻讀

在SQL Server中給事務(wù)指定一個隔離級別,這個隔離級別定義該事務(wù)與其他事務(wù)進(jìn)行資源或數(shù)據(jù)更改相隔離的級別。事務(wù)隔離級別決定了是否鎖定SQL Server對象,下面是SQL Server中的事務(wù)隔離級別。

  • Rdad Uncommitted : 讀取數(shù)據(jù)不需要等待解鎖,這種方式會讀到臟數(shù)據(jù),因為讀取的數(shù)據(jù)有可能是還沒有更新的數(shù)據(jù)。這種隔離級別最低,會造成臟讀,不可重復(fù)讀和幻讀的結(jié)果,并發(fā)性最高。
  • Read Committed : 讀取數(shù)據(jù)需要等待解鎖,這樣會讀取到最新的被更新的數(shù)據(jù)。Read Committed不會造成臟讀的問題,但是會造成不可重復(fù)的和幻讀的問題。Read Committed是SQL Server的默認(rèn)設(shè)置。
  • Repeatable Read : 與Read Committed類似,它會鎖定所讀取的所有行,但是沒有其他的連接可以更新或插入數(shù)據(jù),這樣如果select語句可能選擇到這條新跟新或插入的數(shù)據(jù),這條數(shù)據(jù)記錄是不會出現(xiàn)在select結(jié)果中的。同時被選擇出的數(shù)據(jù)也不能被其他連接更改,直到讀取動作執(zhí)行結(jié)束或者回滾結(jié)束。這種隔離級別不會造成臟讀和不可重復(fù)讀,但是會造成幻讀。
  • Serializable :和Repeatable Read類似,不過沒有其他的連接可以插入或更新數(shù)據(jù),同時如果在下次查詢中任然使用這種事務(wù)隔離級別,你會得到相同的查詢結(jié)果,就是說更新或新插入的數(shù)據(jù)任然不會出現(xiàn)在查詢結(jié)果中。這種隔離級別不會造成臟讀,不可重復(fù)讀或幻讀。

還有兩種是SQL Server 2005中新添加的事務(wù)隔離級別

  • 一種Read Committed級別的變異,當(dāng)你把數(shù)據(jù)庫的隔離級別設(shè)置成READ_COMMITTED_SNAPHOT,任何使用Read Committed級別的的事務(wù)不再需要鎖定數(shù)據(jù)對象。執(zhí)行語句時會得到select語句開始執(zhí)行之時會得到所有最新的結(jié)果。
  • SNAPSHOT :一種全新的級別SNAPSHOT,當(dāng)你在任何數(shù)據(jù)庫對象中設(shè)置事務(wù)的隔離級別為ALLOW_SNAPSHOT_ISOLATION時,其他事務(wù)都不會遇到共享鎖,查詢結(jié)果會得到所有更新之后的行。這種隔離級別不會造成臟讀,不可更新讀和幻讀的結(jié)果

?所有上述的事務(wù)處理都在tempdb數(shù)據(jù)庫中一個類似版本庫的數(shù)據(jù)對象中自動進(jìn)行,當(dāng)遇到更新未被提交的情況,數(shù)據(jù)引擎會檢索這個版本庫得到合適的提交結(jié)果。維護(hù)這個版本庫的工作由SQL Server自動進(jìn)行,不需要人為干預(yù)。

??

SSIS中的事務(wù)處理

SSIS中的包,容器(例如Loop,F(xiàn)oreach Loop,Sequence)或者一個單獨(dú)的任務(wù)中都可以設(shè)置事務(wù)處理選項。事務(wù)處理選項有下面一些值??????         

  • Required-如有事務(wù)則添加,否則新添加一個
  • Supported-如有有事務(wù)添加一個,沒有則不添加,這是默認(rèn)選項+
  • NotSupported-不添加事務(wù)處理

內(nèi)建的事務(wù)處理要使用Distributed Transaction Coordinator(MSDTC)服務(wù),這個服務(wù)必須開啟。MSDTC允許使用分布式事務(wù)處理,例如在一個事務(wù)中同時處理SQL Server數(shù)據(jù)庫和Oracle數(shù)據(jù)庫。如果沒有開啟這個服務(wù)會得到下面的錯誤提示.

Error: 0xC001401A at Transaction: The SSIS Runtime has failed to start the distributed transaction due to error 0x8004D01B "The Transaction Manager is not available.". The DTC transaction failed to start. This could occur because the MSDTC Service is not running.

注意SSIS中包中的元素的事務(wù)隔離級別是Serializable,這種級別會影響鎖的持續(xù)時間。下面我們來用一個例子說明在如何package中鎖定一個表

  1. 新建一個SequenceContainer,命名為Test Initialization。
  2. 這個SequenceContainer主要用來創(chuàng)建測試的環(huán)境,創(chuàng)建連個表TranQueue,TranQueueHistory,向第一個表中添加一條記錄,這樣模擬一個事物處理  過程。我們只是使用這個SequenceContainer來創(chuàng)建測試環(huán)境,所以設(shè)置它的TransactionOption選項為NotSupported在這個SequenceContainer中依次添加三個Execute SQL,依次他們的設(shè)置如下?
              
    1 /* 命名 */
    2 Create TranQueue Table
    3 /* SQLstatement設(shè)置 */
    4 IF NOT EXISTS ( SELECT * FROM sys.objects WHERE object_id =
    5
    6 OBJECT_ID (N ' dbo.TranQueue ' ) AND type in (N ' U ' ) )
    7 BEGIN
    8 execute ( ' CREATE TABLE dbo.TranQueue(message nvarchar(256)) ' )
    9 END
    10 /* 命名 */
    11 Populate TranQueue
    12 /* SQLstatement設(shè)置 */
    13 INSERT INTO dbo.TranQueue VALUES ( ' Test Message ' + CONVERT
    14
    15 ( NVARCHAR ( 23 ), GETDATE (), 121 ))
    16 /* 命名 */
    17 Create TranQueueHistory table
    18 /* SQLstatement設(shè)置 */
    19 IF NOT EXISTS ( SELECT * FROM sys.objects WHERE object_id =
    20
    21 OBJECT_ID (N ' dbo.TranQueueHistory ' ) AND type in (N ' U ' ) )
    22 BEGIN
    23 execute ( ' CREATE TABLE dbo.TranQueueHistory(message nvarchar(256)) ' )
    24 END
  3. 創(chuàng)建第二個SequenceContainer,命名為Process,TransactionOption屬性設(shè)置為Supported,這樣就會添加事務(wù)處理。??
  4. 在這個SequenceContainer中添加一個Execute SQL,命名為ProcessTranQueue,它的SQLStatement設(shè)置為下面的語句。這個語句的作用,模擬事務(wù)處理,刪除TranQueue表中前10條數(shù)據(jù);OUTPUT字句將刪除的數(shù)據(jù)插入到TranQueueHistory表中,模擬處理結(jié)束,更新歷史記錄
              
    1 DELETE TOP ( 10 ) dbo.TranQueue
    2 OUTPUT DELETED. *
    3 INTO dbo.TranQueueHistory
    4 FROM dbo.TranQueue WITH (TABLOCKX)
  5. 添加一個Execute SQL,命名為Placeholder for Breakpoint。這個任務(wù)不進(jìn)行任何操作,只是為了在這設(shè)置一個斷點然后在這里停下來讓我們有時間驗證是否會鎖定表。
  6. 右擊Control Flow界面添加一個變量v_SimulateFailure,類型為Int32,值為1。
  7. 添加一個Execute SQL命名為Simulate Failure。用它來模擬錯誤,設(shè)置SQLStatement為select 1/0,當(dāng)pacakage執(zhí)行到這里的時候會造成錯誤進(jìn)而回滾。
  8. 右擊Placeholder for Breakpoint和Simulate Failure之間的連線,點擊Edit,設(shè)置Evaluation operation為Expression and Constraint,設(shè)置Expression為@[User::v_SimulateFailure] == 1,其他保持默認(rèn)。這樣之后這個自定義變量的值為1的時候才會繼續(xù)往下執(zhí)行。
  9. 執(zhí)行package,會得到如圖1的結(jié)果,package在斷點處終止。

? SQL點滴9—SQL Server中的事務(wù)處理以及SSIS中的內(nèi)建事務(wù) ?圖1???????????????

10.打開SQL Server Management Studion,選擇對應(yīng)的數(shù)據(jù)庫,新建一個Query,執(zhí)行下面的語句,NOLOCK選項忽略鎖,這個語句查詢得到一條記錄 Message2011-04-10 14:22:31.043,但是這條記錄并沒有提交

      
        1
      
      
        SELECT
      
      
      
      
        *
      
      
      
      
        FROM
      
      
         dbo.TranQueueHistory 
      
      
        WITH
      
      
         (NOLOCK)
      
    

11.執(zhí)行下面的語句

      
1 SELECT * FROM dbo.TranQueue

語句將阻塞在這里,語句一直停留在執(zhí)行狀態(tài),不會結(jié)束。因為在Process TranQueue任務(wù)中我們使用TABLOCKX,在這里將等待任務(wù)回滾或者提交。或者可以寫成這樣,它任然會阻塞

      
1 DELETE TOP ( 10 ) dbo.TranQueue
2 ? INSERT INTO dbo.TranQueueHistory VALUES ( ' Test Message ' + CONVERT ( NVARCHAR ( 23 ), GETDATE (), 121 ))

12.?點擊Continue按鈕或者Debuge按鈕,會看到package執(zhí)行失敗,執(zhí)行SELECT * FROM dbo.TranQueueHistory

?????? WITH (NOLOCK);因為執(zhí)行了回滾,不會得到任何結(jié)果。SELECT * FROM dbo.TranQueue,任然有一條記錄。?

      
        SELECT
      
      
      
      
        *
      
      
      
      
        FROM
      
      
         dbo.TranQueueHistory 
      
      
        WITH
      
      
         (NOLOCK)
      
    

   NOLOCK提示忽略鎖,這個語句查詢得到一條記錄 Message2011-04-10 14:22:31.043,但是這條記錄并沒有提交

13.? 執(zhí)行下面的語句,

      
        SELECT
      
      
      
      
        *
      
      
      
      
        FROM
      
      
         dbo.TranQueue
      
    

sql語句將阻塞在這里,語句一直執(zhí)行。因為在Process TranQueue任務(wù)中我們使用TABLOCKX,在這里將等待任務(wù)回滾或者提交。或者可以寫成這樣

DELETE TOP(10) dbo.TranQueue;INSERT INTO dbo.TranQueueHistory VALUES ('Test Message' + CONVERT(NVARCHAR(23), GETDATE(), 121)),它任然會阻塞??????

14.??點擊Continue按鈕或者Debuge按鈕,會看到package執(zhí)行失敗,執(zhí)行SELECT * FROM dbo.TranQueueHistory?WITH (NOLOCK);因為執(zhí)行了回滾,不會得到任何結(jié)果。執(zhí)行SELECT * FROM dbo.TranQueue,任然有一條記錄。

?????

如果設(shè)置變量User::v_SimulateFailure的值為0,不會執(zhí)行Simulate Failure任務(wù),就不會回滾,TranQueue中的記錄會被寫入到TranQueueHistory中。這里有一個很有意思的語句:

DELETE TOP(10) dbo.TranQueue
OUTPUT DELETED.*
INTO dbo.TranQueueHistory
FROM dbo.TranQueue WITH (TABLOCKX)

如果兩個表的結(jié)構(gòu)有一部分是是一樣的,現(xiàn)在想把一個表的數(shù)據(jù)導(dǎo)入到另外一個表中,可以使用DELETE SourceTable?OUTPUT DELETE.*/DELETE.Column1,DELETE.Column2... INTO DestinationTable FROM SourceTable,這樣第一個表中的數(shù)據(jù)會被“剪切”到第二個表中。

SQL點滴9—SQL Server中的事務(wù)處理以及SSIS中的內(nèi)建事務(wù)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美专区在线 | 亚洲va天堂va国产va久 | 最近中文国语字幕在线播放视频 | 久久人与动人物a级毛片 | 奇米第四色888| 干成人网 | 久青草国产手机在线视频 | 久久天天躁狠狠躁夜夜爽 | 欧美精品久久久久久久久大尺度 | 久久精品亚洲一区二区 | 婷婷综合久久狠狠色99h | 成 人国产在线观看高清不卡 | 99热最新在线观看 | 四虎免费视频 | 亚洲国产中文字幕在线观看 | 91国内精品久久久久免费影院 | 男女啪啪网站 | 国产网友自拍视频 | 色综久久天天综合绕视看 | 九九99香蕉在线视频美国毛片 | 欧美毛片aaaaa片久久久久 | 国产成人亚洲精品老王 | 久久视频这里只精品3国产 久久视频这里只有精品 | 久久久久亚洲国产 | 欧美大尺度 边吃奶边做 | 国产精品成在线观看 | 亚洲国产欧美日韩一区二区 | 色福利网| 成人香蕉网 | 夜色精品国产一区二区 | 亚洲123区 | 欧美成人特黄级毛片 | 日日夜夜天天 | 波多野结衣 一区二区 | 在线a网| 久久精品国产精品亚洲综合 | 一道精品视频一区二区三区图片 | 手机福利在线 | 成人短视频在线在线观看 | 成人久久网 | 亚洲欧美国产五月天综合 |