SQL Server(十) 事務和鎖

2021-07-26 21:56:52 字數 2264 閱讀 4440

一、事務的特性

1、原子性:事務必須是原子性的工作單元,要麼全部執行,要麼全部不執行。

2、一致性:事務完成時,必須使所有資料保持一致性。

3、隔離性:由併發事務所做的修改必須與其他併發事務所做的修改隔離。由於事務在開始時就會識別資料所處的狀態,以便發生錯誤時可以回滾操作,所以另乙個併發事務要麼修改它之前的狀態,要麼修改它之後的狀態,不能在該事務執行時修改它的狀態。這也被稱為可序列性。

4、永續性:在事務完成後,其操作結果對系統的影響應該是永久的,只要事務成功,就不能再次回滾。

二、建立和使用事務

begin

tran

-- 開始事務

print

'執行語句 1'

if @@error

>

0goto tranrollback

print

'執行語句 2'

if @@error

>

0goto tranrollback

if @@error

>

0or @@rowcount

<>

1begin

tranrollback:

rollback

tran

-- 如果有錯誤則回滾事務

endelse

commit

tran

-- 如果沒有錯誤則提交事務

-- 建議使用 try..catch 語句

三、執行事務的注意事項:

1、每個操作之後都要檢查一下@@error和@@rowcount的值。

2、當乙個事務結束之後,緊跟之後的t-sql **還可以繼續執行,但是出錯後不能回滾。

3、已結提交的事務會將資料正式寫入資料庫,此時不能再回滾事務。

4、當事務執行時付過發生斷電等意外,則下次重啟系統時,該事務會自動回滾。

5、事務裡傳送錯誤使事務無法執行下去時事務也會回滾。

6、禁止在事務中使用的語句:create database、alter database、drop database、load database、restore database、backup log、restore log、load transaction、dump transaction、disk init、reconfigure、update statistics

四、事務的執行模式

1、顯示事務:明確使用「begin tran」語句開始,以「commit tran」或「rollback tran」語句結束的事務。

2、自動提交事務。自動提交事務是sql server database engine 的預設事務方式,每乙個 t-sql 語句都可以看成是乙個自動提交的事務。會自動提交事務的語句有:alter table、truncate table、create table、select、insert、update、delete、drop、open、fetch、revoke、grant。

3、隱式事務:當執行「set implict_transactions on」語句後sql server進入隱式事務模式。隱式事務產生了乙個連續的事務鏈,當事務在提交或回滾後系統自動啟動新的事務,不需再次定義事務的開始。

五、事務的隔離級別

1、read uncommitted:不隔離資料,該事務執行時允許其他事務同時修改或刪除資料。

2、read committed:不允許讀取沒有提交的資料,sql server預設的隔離級別。

3、repeatable read:在事務中鎖定所讀取的資料不讓其他程式修改和刪除,如此可以保證每次讀取到的資料是一致的。其他事務可以往該錶新增資料。

4、snapshot:快照隔離,可以為讀取資料的事務提供所需資料的乙個已提交版本,因為寫入資料的事務不會阻塞讀取事務的事務。

5、serialzable:將事務用的資料表全部鎖定。該等級併發性最低。

read uncommitted與read committed屬於樂觀併發控制,其他屬於悲觀併發控制。

set transction islation level

read

committed

六、鎖

七、死鎖(待續)

dbcc traceon

dbcc tracestatus

set deadlock_priority #設定死鎖優先順序

sqlserver併發處理,鎖和事務

本文系 謝謝 另外這個也不錯 鎖的概述 一.為什麼要引入鎖 多個使用者同時對資料庫的併發操作時會帶來以下資料不一致的問題 丟失更新 a,b兩個使用者讀同一資料並進行修改,其中乙個使用者的修改結果破壞了另乙個修改的結果,比如訂票系統 髒讀 a使用者修改了資料,隨後b使用者又讀出該資料,但a使用者因為某...

SQLserver鎖和事務隔離級別

隔離級別 隔離級別 髒讀不可重複讀 幻象說明 未提交讀 read uncommitted 是是 是如果其他事務更新,不管是否提交,立即執行 提交讀 read committed預設 否是 是讀取提交過的資料。如果其他事務更新沒提交,則等待 可重複讀 repeatable read 否否 是查詢期間,...

SQLserver鎖和事務隔離級別的比較與使用

來自 物件 鎖 每條sql 語句 隔離 事務 鎖 併發問題 丟失更新 未確認的讀取 髒讀 不一致的分析 非重複讀 多次讀取相同的資料 行 不一致 其他使用者更改update 幻像讀 多次讀取有不存在和新增的資料 其他使用者插入insert 或刪除delete 隔離級別 隔離級別 髒讀 不可重複讀取 ...