資料庫更新鎖WITH UPDLOCK

2021-09-08 13:51:36 字數 1620 閱讀 4630

今天因為併發的問題,又討論了一遍。之前以為同時兩個執行緒開啟,執行緒a加了更新鎖,執行緒b沒有加,執行緒a更新後,執行緒b也會繼續下去**。但是今天測試了一下,原來執行緒a更新後(解鎖),執行緒b將不會繼續,會出現資料庫語句出現修改之類的提示。

寫法 select * from table with updlock where id=1

a**段示例:

using (transactionscope trans = new transactionscope())

", crossdomainpayrecord.id);

vipweregister046play model = dbcontext.database.sqlquery(sqlstr).firstordefault();

if (status == 0)//說明出現問題

trans.complete();

}}

b**段示例 :

using (activitydbcontext dbcontext=new activitydbcontext())

listshare = dbcontext.shares.tolist();

if (share.count == 0)

share = dbcontext.shares.tolist();

foreach (var item in share)

}

1.執行緒a進入更新鎖**段,執行緒b將會停止在dbcontext.update處,不會再繼續下去(解鎖操作兩種:1.更新操作(非事務處理);2.事務處理結束(處於事務))

接下來有三種情況:

1.1執行緒a不進行更新操作(沒有update操作,即使沒有改變值),執行緒a結束事務後(解鎖),執行緒b將繼續執行

1.2執行緒a進行了更新操作,即此時status狀態值更改為0,執行緒b將會跳轉入異常,異常詳細上會有資料庫資訊更改之類的提示

1.3執行緒a一直停留在斷點,不進行解鎖操作,時間一旦達到限制,則執行緒b將會提示請求超時之類的(由於資料庫請求是有設定時限的)

2.執行緒a未進入更新鎖**段,則執行緒b按照正常執行

3.執行緒a進入更新鎖**段時,執行緒b也可以使用select獲取,即listmodel= dbcontext.table.tolist();這句會被執行的,直到update操作停止

4.一旦a執行緒進入更新鎖**,且進行了update操作,執行緒b中的插入更新dbcontext.insert(new table()); dbcontext.update(item);這兩句都不能執行,會出現報錯。而share表相關的insert和update也不能執行,這是因為share的**處理在table下面,此時dbcontext已是異常狀態。如果將share放置到table**上方,則會正常執行或者是將share重新開啟乙個dbcontext2進行操作。不過其中應該還有一些緣由...

5.一旦a執行緒進入更新鎖**,且未進行update操作,執行緒b中的插入dbcontext.insert(new table());**是會被執行的,且share相關的**都會被執行。

資料庫更新鎖WITH UPDLOCK

今天因為併發的問題,又討論了一遍。之前以為同時兩個執行緒開啟,執行緒a加了更新鎖,執行緒b沒有加,執行緒a更新後,執行緒b也會繼續下去 但是今天測試了一下,原來執行緒a更新後 解鎖 執行緒b將不會繼續,會出現資料庫語句出現修改之類的提示。寫法 select from table with updlo...

資料庫中鎖(簡易描述,持續更新)

共享鎖和共享鎖可以共存,共享鎖和排它鎖不能共存,只有在serializable隔離級別下做查詢會新增共享鎖 案例 開啟兩個客戶端並都設定隔離級別為serializable,分別在兩個客戶端中進行查詢 實現步驟 1.開啟2個視窗分別設定隔離級別都為serializable 2.開啟事務執行查詢 視窗1...

資料庫更新

region 將資訊存入資料庫store the information to the sql int userid convert.toint32 session userid oledbconnection cn new oledbconnection strcn string sqlcmd u...