本文介紹了Sql服務(wù)器事務(wù)是原子的嗎?的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!
問(wèn)題描述
所以我有一個(gè)類(lèi)似下面的存儲(chǔ)過(guò)程(SQL SERVER 2008 R2)
BEGIN TRAN
BEGIN TRY
//critical section
select value
update value
//end of critical section
COMMIT
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
END CATCH
我不希望兩個(gè)存儲(chǔ)過(guò)程讀取相同的值。換句話說(shuō),讀取和更新應(yīng)該是原子的。
這段代碼是這樣做的嗎?如果不是,我該怎么做?
推薦答案
是的,它們是原子的,但這并不意味著您將在這里獲得您想要的行為!您需要查看的屬性是隔離。
要實(shí)現(xiàn)所需的排除,您需要對(duì)單個(gè)值mutually exclusive執(zhí)行SELECT
操作。為此,您可以請(qǐng)求Update
鎖(確保可以通過(guò)索引找到WHERE
謂詞,以避免鎖定不必要的額外行)
SELECT * FROM foo WITH(ROWLOCK,UPDLOCK) WHERE bar='baz'
注意:此鎖將一直保持到您的事務(wù)提交,但不會(huì)在臨界區(qū)結(jié)束時(shí)釋放,但如果您無(wú)論如何都更新了該值,情況將始終如此。
這篇關(guān)于Sql服務(wù)器事務(wù)是原子的嗎?的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,