MS SQL 鎖與事務

2022-01-24 18:27:04 字數 2809 閱讀 5296

加鎖的主要目的是為了防止併發操作時導致的資料不一致等問題,鎖分為共享鎖(s)、更新鎖(u)、排他鎖(x),共享鎖與更新只是單向相容?傳說中的單相思?

事務

事務能保證資料操作的原子性,要麼內部操作都提交,要麼都回退。事務內部某個地方出錯時,可以回滾前面的操作,比如更新、刪除等。

begin

tran

---報錯時回滾

if@@error

<>

0rollback

tran

--執行完後提交

commit

tran

共享鎖

共享鎖允許併發事務讀取乙個資源,資源上存在共享鎖時,任何其他事務不能修改資料,但是允許同時讀取。

holdlock 在表上保持共享鎖,直到整個事務結束。

執行查詢時會預設加上共享鎖。

begin

tran

eeselect

*from aa(holdlock

)waitfor delay '

0:0:30

'commit

tran ee

begin

tran

rrselect

*from aa(holdlock

)commit

tran rr

上面的例子,都在表aa上加了共享鎖,執行結果表明,即使第乙個事務沒有執行完,第二個事務仍然可以直接查詢出結果。這就說明,共享鎖是可以同時存在多個的,多個事務可以同時獲取同一資源的共享鎖。

排他鎖

xlock 其他事務不能讀也不能修改它鎖定的資源。

執行更新時會自動新增排他鎖。

共享鎖與排他鎖不能同時存在。

begin

tran

eeselect

*from aa(holdlock

)waitfor delay '

0:0:30

'commit

tran ee

begin

tran

rrupdate aa set tt='33

'where dd='44

'commit

tran rr

第乙個事務在執行完成之前,第二個事務的更新一直沒有進行,直到第乙個事務完成之後,第二個事務中執行的更新操作才能進行。這就表明,共享鎖與排他鎖時不能同時存在的。一旦乙個事務獲取到了乙個資源的共享鎖,那麼只有等到共享鎖釋放之後,才能被其他事務獲取排他鎖。

更新鎖

updlock 一次只有乙個事務可以獲得資源的更新鎖,獲取了更新鎖意味著獲取了從共享鎖到排他鎖的資格。但是不會影響其他的查詢,只會阻止那些試圖加更新鎖的操作。同一時間在同乙個資源上不能有兩個更新鎖,同時加共享鎖時允許的。

共享鎖與更新鎖是相容的,允許同時在乙個資源上。

排他鎖與更新鎖是不相容的,不能同時加在乙個資源上。

begin

tran

rrselect

*from

aa(updlock)

waitfor delay '

0:0:30

'commit

tran rr

begin

tran

eeselect

*from aa(holdlock

)commit

tran ee

以上**測試結果表明,在資源上加了更新鎖之後,還可以繼續加共享鎖,也就說並不影響查詢。但是,看下面的例子。

begin

tran

eeselect

*from aa(holdlock

)waitfor delay '

0:0:30

'commit

tran ee

begin

tran

rrselect

*from

aa(updlock)

commit

tran rr

上面的例子是先加共享鎖,然後再加更新鎖,測試結果表明,在第乙個事務結束之前,第二個事務並不能獲取到更新鎖。所以,是不是可以說更新鎖與共享鎖的相容是單向的。

begin

tran

eeselect

*from

aa(updlock)

waitfor delay '

0:0:30

'commit

tran ee

begin

tran

rrselect

*from

aa(updlock)

commit

tran rr

上面的測試結果表明,不能同時獲取同乙個資源的更新鎖。

begin

tran

eeselect

*from

aa(updlock)

waitfor delay '

0:0:30

'commit

tran ee

begin

tran

rr--

select * from aa(xlock)

update aa set tt='44

'commit

tran rr

上面測試表明,加了更新鎖,就不能獲得排他鎖。

MS SQL 鎖與事務

ms sql 鎖與事務 加鎖的主要目的是為了防止併發操作時導致的資料不一致等問題,鎖分為共享鎖 s 更新鎖 u 排他鎖 x 共享鎖與更新只是單向相容?傳說中的單相思?事務事務能保證資料操作的原子性,要麼內部操作都提交,要麼都回退。事務內部某個地方出錯時,可以回滾前面的操作,比如更新 刪除等。複製 b...

mysql事務與鎖機制 mysql事務與鎖機制

在併發下事務會容易出現的一些問題 資料更新丟失 兩個事務同時操作一條資料,乙個事務因為異常導致資料更新丟失 髒讀 乙個失誤開始讀取了某行資料,另外乙個事務已經更新了此資料但沒有能夠及時提交。這是相當危險的,因為很可能所有的操作都被回滾。不可重複讀 乙個事務對同一行資料重複讀取兩次,但是卻得到了不同的...

oracle事務與鎖

一.事務有4個特性,它們分別是原子性,一致性,分離性,永續性.1 原子性 事務的原子性是指,事務中程式是資料庫的邏輯工作單位,它對資料的修改要麼全部執行,要麼完全不執行.原子也意味著不可分割,不管有多少程式,只要在同乙個事務中,那麼它們就是乙個整體,如果都執行成功才意味著該事務成功,而有乙個操作失敗...