SQL Server事務全攻略

SQL Server事務全攻略(一)

  一 事務的屬性

  事務具有ACID屬性,即 Atomic原子性,Consistent一致性, Isolated隔離性, Durable永久性

 

  原子性

  就是事務應作爲一個工作單元,事務處理完成,所有的工作要麼都在數據庫中保存下來,要麼完全 
回滾,全部不保留

  一致性

  事務完成或者撤銷後,都應該處於一致的狀態

  隔離性

  多個事務同時進行,它們之間應該互不干擾.應該防止一個事務處理其他事務也要修改的數據時, 
不合理的存取和不完整的讀取數據

  永久性

  事務提交以後,所做的工作就被永久的保存下來

  二 事務併發處理會產生的問題

  丟失更新

  當兩個或多個事務選擇同一行,然後基於最初選定的值更新該行時,會發生丟失更新問題、 
每個事務都不知道其它事務的存在。最後的更新將重寫由其它事務所做的更新,這將導致數據丟失。

  髒讀

  當第二個事務選擇其它事務正在更新的行時,會發生未確認的相關性問題。第二個事務正在讀取的數據還沒有確認並且可能由更新此行的事務所更改。

  不可重複讀

  當第二個事務多次訪問同一行而且每次讀取不同的數據時,會發生不一致的分析問題。不一致的分析與未確認的相關性類似,因爲其它事務也是正在更改第二個事務正在讀取的數據。然而,在不一致的分析中,第二個事務讀取的數據是由已進行了更改的事務提交的。而且,不一致的分析涉及多次(兩次或更多)讀取同一行,而且每次信息都由其它事務更改;因而該行被非重複讀取。

  幻像讀

  當對某行執行插入或刪除操作,而該行屬於某個事務正在讀取的行的範圍時,會發生幻像讀問題。事務第一次讀的行範圍顯示出其中一行已不復存在於第二次讀或後續讀中,因爲該行已被其它事務刪除。同樣,由於其它事務的插入操作,事務的第二次或後續讀顯示有一行已不存在於原始讀中。

  三 事務處理類型

  自動處理事務

  系統默認每個T-SQL命令都是事務處理 由系統自動開始並提交

  隱式事務

  當有大量的DDL 和DML命令執行時會自動開始,並一直保持到用戶明確提交爲止,切換隱式事務可以用SET  IMPLICIT_TRANSACTIONS  爲連接設置隱性事務模式.當設置爲 ON 時,SET IMPLICIT_TRANSACTIONS 將連接設置爲隱性事務模式。當設置爲 OFF 時,則使連接返回到自動提交事務模式

  用戶定義事務

  由用戶來控制事務的開始和結束 命令有: begin tran commit tran rollback tran 命令

  分佈式事務

  跨越多個服務器的事務稱爲分佈式事務,sql server 可以由DTc microsoft distributed transaction coordinator 
來支持處理分佈式事務,可以使用 BEgin distributed transaction 命令啓動一個分佈式事務處理

 

  四 事務處理的隔離級別

  使用SET TRANSACTION ISOLATION LEVEL來控制由連接發出的所有語句的默認事務鎖定行爲

  從低到高依次是 READ UNCOMMITTED

  執行髒讀或 0 級隔離鎖定,這表示不發出共享鎖,也不接受排它鎖。當設置該選項時,可以對數據執行未提交讀或髒讀;在事務結束前可以更改數據內的數值,行也可以出現在數據集中或從數據集消失。該選項的作用與在事務內所有語句中的所有表上設置 NOLOCK 相同。這是四個隔離級別中限制最小的級別。

  舉例,設table1(A,B,C)

A  B C
a1  b1  c1
a2  b2 c2
a3  b3  c3

 

  新建兩個連接

  在第一個連接中執行以下語句 

select * from table1 begin tran update table1 set c='c' select * from table1 waitfor delay '00:00:10' --等待10秒 rollback tran select * from table1

   在第二個連接中執行以下語句

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED print '髒讀' select * from table1 if @@rowcount>0 begin waitfor delay '00:00:10' print '不重複讀' select * from table1 end

  第二個連接的結果

  髒讀 

A  B C
a1  b1  c1
a2  b2  c
a3  b3 c

 

  '不重複讀'

A  B C
a1  b1  c1
a2  b2  c2
a3  b3 c3

  READ COMMITTED

 

  指定在讀取數據時控制共享鎖以避免髒讀,但數據可在事務結束前更改,從而產生不可重複讀取或幻像數據。該選項是 SQL Server 的默認值。

  在第一個連接中執行以下語句

SET TRANSACTION ISOLATION LEVEL READ COMMITTED begin tran print '初始' select * from table1 waitfor delay '00:00:10' --等待10秒 print '不重複讀' select * from table1 rollback tran

  在第二個連接中執行以下語句

SET TRANSACTION ISOLATION LEVEL READ COMMITTED update table1 set c='c'

  第一個連接的結果

  初始

A B C
a1  b1  c1
a2  b2  c2
a3  b3  c3

  不重複讀
A B C
a1 b1 c
a2  b2 c
a3  b3  c

  REPEATABLE READ

 

  鎖定查詢中使用的所有數據以防止其他用戶更新數據,但是其他用戶可以將新的幻像行插入數據集,且幻像行包括在當前事務的後續讀取中。因爲併發低於默認隔離級別,所以應只在必要時才使用該選項。

  在第一個連接中執行以下語句 

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ begin tran print '初始' select * from table1 waitfor delay '00:00:10' --等待10秒 print '幻像讀' select * from table1 rollback tran

   在第二個連接中執行以下語句

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ insert table1 select 'a4''b4''c4'

  第一個連接的結果

  初始

A B C
a1 b1  c1
a2  b2 c2
a3  b3  c3

  幻像讀
A

B

C
a1  b1  c1
a2 b2  c2
a3  b3  c3
a4 b4  c4

     SERIALIZABLE

 

  在數據集上放置一個範圍鎖,以防止其他用戶在事務完成之前更新數據集或將行插入數據集內。這是四個隔離級別中限制最大的級別。因爲併發級別較低,所以應只在必要時才使用該選項。該選項的作用與在事務內所有 SELECT 語句中的所有表上設置 HOLDLOCK 相同。

  在第一個連接中執行以下語句

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE begin tran print '初始' select * from table1 waitfor delay '00:00:10' --等待10秒 print '沒有變化' select * from table1 rollback tran

  在第二個連接中執行以下語句

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE insert table1 select 'a4''b4''c4'

  第一個連接的結果

  初始

A B C
a1  b1  c1
a2  b2 c2
a3  b3  c3
   沒有變化
A B C
a1  b1  c1
a2  b2 c2
a3  b3 c3

  五 事務處理嵌套的語法和對@@TRANCOUNT的影響

 

BEGIN TRAN @@TRANCOUNT+1 COMMIT TRAN @@TRANCOUNT-1 ROLLBACK TRAN

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章