一 事務(wù)的屬性
事務(wù)具有ACID屬性
即 Atomic原子性, Consistent一致性, Isolated隔離性, Durable永久性
原子性
就是事務(wù)應作為一個(gè)工作單元,事務(wù)處理完成,所有的工作要么都在數據庫中保存下來(lái),要么完全
回滾,全部不保留
一致性
事務(wù)完成或者撤銷(xiāo)后,都應該處于一致的狀態(tài)
隔離性
多個(gè)事務(wù)同時(shí)進(jìn)行,它們之間應該互不干擾.應該防止一個(gè)事務(wù)處理其他事務(wù)也要修改的數據時(shí),
不合理的存取和不完整的讀取數據
永久性
事務(wù)提交以后,所做的工作就被永久的保存下來(lái)
二 事務(wù)并發(fā)處理會(huì )產(chǎn)生的問(wèn)題
丟失更新
當兩個(gè)或多個(gè)事務(wù)選擇同一行,然后基于最初選定的值更新該行時(shí),會(huì )發(fā)生丟失更新問(wèn)題、
每個(gè)事務(wù)都不知道其它事務(wù)的存在。最后的更新將重寫(xiě)由其它事務(wù)所做的更新,這將導致數據丟失。
臟讀
當第二個(gè)事務(wù)選擇其它事務(wù)正在更新的行時(shí),會(huì )發(fā)生未確認的相關(guān)性問(wèn)題。
第二個(gè)事務(wù)正在讀取的數據還沒(méi)有確認并且可能由更新此行的事務(wù)所更改。
不可重復讀
當第二個(gè)事務(wù)多次訪(fǎng)問(wèn)同一行而且每次讀取不同的數據時(shí),會(huì )發(fā)生不一致的分析問(wèn)題。
不一致的分析與未確認的相關(guān)性類(lèi)似,因為其它事務(wù)也是正在更改第二個(gè)事務(wù)正在讀取的數據。
然而,在不一致的分析中,第二個(gè)事務(wù)讀取的數據是由已進(jìn)行了更改的事務(wù)提交的。而且,不一致的分析涉及多次(兩次或更多)讀取同一行,而且每次信息都由其它事務(wù)更改;因而該行被非重復讀取。
幻像讀
當對某行執行插入或刪除操作,而該行屬于某個(gè)事務(wù)正在讀取的行的范圍時(shí),會(huì )發(fā)生幻像讀問(wèn)題。
事務(wù)第一次讀的行范圍顯示出其中一行已不復存在于第二次讀或后續讀中,因為該行已被其它事務(wù)刪除。同樣,由于其它事務(wù)的插入操作,事務(wù)的第二次或后續讀顯示有一行已不存在于原始讀中。
三 事務(wù)處理類(lèi)型
自動(dòng)處理事務(wù)
系統默認每個(gè)T-SQL命令都是事務(wù)處理 由系統自動(dòng)開(kāi)始并提交
隱式事務(wù)
當有大量的DDL 和DML命令執行時(shí)會(huì )自動(dòng)開(kāi)始,并一直保持到用戶(hù)明確提交為止,切換隱式事務(wù)可以用SET IMPLICIT_TRANSACTIONS
為連接設置隱性事務(wù)模式.當設置為 ON 時(shí),SET IMPLICIT_TRANSACTIONS 將連接設置為隱性事務(wù)模式。當設置為 OFF 時(shí),則使連接返回到自動(dòng)提交事務(wù)模式
用戶(hù)定義事務(wù)
由用戶(hù)來(lái)控制事務(wù)的開(kāi)始和結束 命令有: begin tran commit tran rollback tran 命令
分布式事務(wù)
跨越多個(gè)服務(wù)器的事務(wù)稱(chēng)為分布式事務(wù),sql server 可以由DTc microsoft distributed transaction coordinator
來(lái)支持處理分布式事務(wù),可以使用 BEgin distributed transaction 命令啟動(dòng)一個(gè)分布式事務(wù)處理
四 事務(wù)處理的隔離級別
使用SET TRANSACTION ISOLATION LEVEL來(lái)控制由連接發(fā)出的所有語(yǔ)句的默認事務(wù)鎖定行為
從低到高依次是
READ UNCOMMITTED
執行臟讀或 0 級隔離鎖定,這表示不發(fā)出共享鎖,也不接受排它鎖。當設置該選項時(shí),可以對數據執行未提交讀或臟讀;在事務(wù)結束前可以更改數據內的數值,行也可以出現在數據集中或從數據集消失。該選項的作用與在事務(wù)內所有語(yǔ)句中的所有表上設置 NOLOCK 相同。這是四個(gè)隔離級別中限制最小的級別。
舉例
設table1(A,B,C)
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
新建兩個(gè)連接
在第一個(gè)連接中執行以下語(yǔ)句
select * from table1
begin tran
update table1 set c='c'
select * from table1
waitfor delay '00:00:10' --等待10秒
rollback tran
select * from table1
在第二個(gè)連接中執行以下語(yǔ)句
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
print '臟讀'
select * from table1
if @@rowcount>0
begin
waitfor delay '00:00:10'
print '不重復讀'
select * from table1
end
第二個(gè)連接的結果
臟讀
A B C
a1 b1 c
a2 b2 c
a3 b3 c
'不重復讀'
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
READ COMMITTED
指定在讀取數據時(shí)控制共享鎖以避免臟讀,但數據可在事務(wù)結束前更改,從而產(chǎn)生不可重復讀取或幻像數據。該選項是 SQL Server 的默認值。
在第一個(gè)連接中執行以下語(yǔ)句
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
begin tran
print '初始'
select * from table1
waitfor delay '00:00:10' --等待10秒
print '不重復讀'
select * from table1
rollback tran
在第二個(gè)連接中執行以下語(yǔ)句
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
update table1 set c='c'
第一個(gè)連接的結果
初始
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
鎖定查詢(xún)中使用的所有數據以防止其他用戶(hù)更新數據,但是其他用戶(hù)可以將新的幻像行插入數據集,且幻像行包括在當前事務(wù)的后續讀取中。因為并發(fā)低于默認隔離級別,所以應只在必要時(shí)才使用該選項。
在第一個(gè)連接中執行以下語(yǔ)句
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
begin tran
print '初始'
select * from table1
waitfor delay '00:00:10' --等待10秒
print '幻像讀'
select * from table1
rollback tran
在第二個(gè)連接中執行以下語(yǔ)句
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
insert table1 select 'a4','b4','c4'
第一個(gè)連接的結果
初始
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
在數據集上放置一個(gè)范圍鎖,以防止其他用戶(hù)在事務(wù)完成之前更新數據集或將行插入數據集內。這是四個(gè)隔離級別中限制最大的級別。因為并發(fā)級別較低,所以應只在必要時(shí)才使用該選項。該選項的作用與在事務(wù)內所有 SELECT 語(yǔ)句中的所有表上設置 HOLDLOCK 相同。
在第一個(gè)連接中執行以下語(yǔ)句
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
begin tran
print '初始'
select * from table1
waitfor delay '00:00:10' --等待10秒
print '沒(méi)有變化'
select * from table1
rollback tran
在第二個(gè)連接中執行以下語(yǔ)句
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
insert table1 select 'a4','b4','c4'
第一個(gè)連接的結果
初始
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
沒(méi)有變化
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
五 事務(wù)處理嵌套的語(yǔ)法和對@@TRANCOUNT的影響
BEGIN TRAN @@TRANCOUNT+1
COMMIT TRAN @@TRANCOUNT-1
ROLLBACK TR
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。