亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

SQL點滴8—SQL Server中的事務處理以及SSIS中的內建事務

2019-11-03 08:33:13
字體:
來源:轉載
供稿:網友

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

事務

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

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

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

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

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

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

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

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

  

SSIS中的事務處理

SSIS中的包,容器(例如Loop,Foreach Loop,Sequence)或者一個單獨的任務中都可以設置事務處理選項。事務處理選項有下面一些值               

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

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

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中包中的元素的事務隔離級別是Serializable,這種級別會影響鎖的持續時間。下面我們來用一個例子說明在如何package中鎖定一個表

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

  圖1               

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

1SELECT * FROM dbo.TranQueueHistory WITH (NOLOCK)

11.執行下面的語句

1SELECT * FROM dbo.TranQueue

語句將阻塞在這里,語句一直停留在執行狀態,不會結束。因為在Process TranQueue任務中我們使用TABLOCKX,在這里將等待任務回滾或者提交?;蛘呖梢詫懗蛇@樣,它任然會阻塞

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

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

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

SELECT * FROM dbo.TranQueueHistory WITH (NOLOCK)

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

13.  執行下面的語句,

SELECT * FROM dbo.TranQueue

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

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

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

     

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

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

如果兩個表的結構有一部分是是一樣的,現在想把一個表的數據導入到另外一個表中,可以使用DELETE SourceTable OUTPUT DELETE.*/DELETE.Column1,DELETE.Column2... INTO DestinationTable FROM SourceTable,這樣第一個表中的數據會被“剪切”到第二個表中。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本欧美精品在线| 久久久国产精彩视频美女艺术照福利| 欧美精品精品精品精品免费| 中文字幕精品www乱入免费视频| 精品久久久久久久久久国产| 欧美黄色三级网站| 日韩第一页在线| 97精品国产97久久久久久| 亚洲激情视频在线播放| 亚洲激情国产精品| 成人网在线免费观看| 国产精品露脸自拍| 欧美激情视频在线观看| 国产成人高清激情视频在线观看| 国产成人精品av| 91在线看www| 欧美中文字幕视频在线观看| 国产精品一香蕉国产线看观看| 欧美日韩性生活视频| 91tv亚洲精品香蕉国产一区7ujn| 538国产精品一区二区免费视频| 国产综合在线观看视频| 97在线观看免费高清| 欧美日韩亚洲高清| 热久久美女精品天天吊色| 亚洲国产精品久久久久秋霞不卡| 日韩视频免费大全中文字幕| 91精品久久久久久久久久久久久| 日韩欧中文字幕| 亚洲国产成人在线视频| 欧美国产精品日韩| 欧美精品久久久久a| 日韩高清免费在线| 国产丝袜一区视频在线观看| 亚洲自拍小视频| 欧美亚洲在线观看| 国产日韩欧美日韩| 久久99精品国产99久久6尤物| 日本亚洲精品在线观看| 九九热这里只有精品免费看| 久久av在线播放| 国产九九精品视频| 久久久久这里只有精品| 日韩免费av片在线观看| 欧美性做爰毛片| 456亚洲影院| 最新69国产成人精品视频免费| 日韩中文字幕在线观看| 欧美性生交大片免网| 日韩av网站在线| 2019中文字幕免费视频| 日韩成人激情影院| 久久精视频免费在线久久完整在线看| 黄色成人av在线| 亚洲天堂av在线免费| 亚洲午夜精品视频| 一区二区欧美激情| 丁香五六月婷婷久久激情| 国产欧美 在线欧美| 88xx成人精品| 中文字幕精品视频| 这里只有精品在线观看| 国产在线观看精品| 国产精品久久久久久久久久久久| 欧美激情视频三区| 久久久免费观看视频| 亚洲人成在线电影| 亚洲黄色av女优在线观看| 国产偷亚洲偷欧美偷精品| 国产一区av在线| 91九色单男在线观看| 狠狠躁夜夜躁人人爽超碰91| 欧美激情中文字幕在线| 精品久久香蕉国产线看观看gif| 欧美午夜女人视频在线| 国产精品狠色婷| 欧美视频13p| 日本一区二区在线免费播放| 91精品视频专区| 国产a∨精品一区二区三区不卡| 成人写真福利网| 亚洲毛片在线免费观看| 国外成人在线视频| 国产一区二区黄| 九九热精品视频| 精品国产91乱高清在线观看| 中文日韩在线视频| 亚洲美女精品成人在线视频| 国产小视频91| 色偷偷88888欧美精品久久久| 国产91色在线|| 亚洲精品一二区| 成人福利视频网| 日本亚洲欧洲色| 91欧美精品午夜性色福利在线| 国产乱肥老妇国产一区二| 5252色成人免费视频| 亚洲香蕉成人av网站在线观看| 亚洲香蕉成人av网站在线观看| 91禁外国网站| 欧美精品成人在线| 亚洲精品乱码久久久久久按摩观| 欧美精品激情在线| 欧美一区二区三区……| 久久久电影免费观看完整版| 日韩国产精品一区| 久久6精品影院| 91精品久久久久久久久久另类| 永久免费毛片在线播放不卡| 亚洲精选中文字幕| 国产精品69久久久久| 97精品视频在线| 日韩av免费观影| 日韩中文字幕在线视频| 国模吧一区二区三区| 亚洲欧美国产日韩天堂区| 日韩av影院在线观看| 欧美成人免费观看| 色综合色综合网色综合| 91精品国产自产在线| 久久成年人免费电影| 亚洲毛片在线观看.| 欧美黄色www| 国产中文字幕亚洲| 中文字幕日韩欧美在线| 青青久久av北条麻妃海外网| 亚洲午夜未满十八勿入免费观看全集| 97色在线视频观看| 一区二区欧美亚洲| 国产日韩欧美在线| 欧美伦理91i| 欧美精品日韩www.p站| 国产狼人综合免费视频| 日韩电视剧免费观看网站| 色与欲影视天天看综合网| 欧美日韩国产精品专区| 国产亚洲欧洲高清一区| 国产精品精品视频一区二区三区| 91国内产香蕉| 91老司机精品视频| 久久久人成影片一区二区三区| 欧美精品videosex极品1| 日韩一区二区三区国产| 亚洲肉体裸体xxxx137| 91免费欧美精品| 国产精品美女久久| 国产精品一区二区三区毛片淫片| 久久九九全国免费精品观看| 精品久久久久久久久久ntr影视| 国产精品久久久999| 日韩最新在线视频| 亚洲成人av片在线观看| 久久97精品久久久久久久不卡| 宅男66日本亚洲欧美视频| 色狠狠av一区二区三区香蕉蜜桃| 日韩免费在线看| 亚洲第一在线视频| 亚洲国内精品在线| 国内精久久久久久久久久人| 欧美激情aaaa| 欧美性精品220| 亚洲欧美制服第一页| 国产精品96久久久久久| 中文字幕一精品亚洲无线一区|