這裏有這篇文章已提交讀快照隔离級別的潜在危险,它說明了RC与RCSI隔离級別。
我得到了RC的例子,但没有RCSI的例子,特別是查詢如何获得結果 -3 . somone可以解釋一下该查詢如何在RCSI下工作吗?
最新回復
- 5月前1 #
- 5月前2 #
試圖解釋如何 我们在表中以-3結尾:我们將事務A和B稱為事務。A首先開始:
Begin tran Reads the value 5, store it in @QtyRemain and verify that we have >= 0 after subtraction of @QtyRequired (being 4) Update, value in table after update is 1 (current val 5 minus required 4 = 1). Waits... End tran
這裏是B,在等待tran A期間開始:
Begin tran Reads the value 5, store it in @QtyRemain and verify we have >= 0 after subtraction of @QtyRequired (being 4) Update, blocked until end of tran A... ...Update now occurs. Value in table after update is -3 (current val 1 minus required 4 = -3)
在鎖定讀取下提交時,很有可能(但不能保證)当两个会话執行此代碼時
第二次会话執行的時間会有足够的差異
在第一个会话執行之後
因此,第二个会话將無法在该行上获取S鎖,並且將被阻塞,直到第一个会话提交為止.但是,這不能保證,因為两个会话都很有可能執行
在其中任何一个執行更新之前。
使用RCSI時,它们更有可能会為@QtyRemain讀取相同的值,因為SELECT永远不会在另一个会话上被掛起的UPDATE阻止,而仅返迴该行的"最後一个好"值 从版本儲存中。
但是由於鎖定讀取的提交版本存在相同的問题,尽管在较小的視窗中,它们都已损壞,應通過將第一个查詢更改為以下內容来解決:
這保證即使两个会话同時尝試进行查詢,一个会话也將被授予U鎖,而另一个將被阻止,直到第一个会话提交為止。