iT邦幫忙

1

MSSQL BLOCK問題處理

  • 分享至 

  • xImage

您好:
請問若 MSSQL 被LOCK 住了

當select ,update , insert 資料被LOCK

1.此時,若去kill
insert /update 的session id
是否會造成 insert /update 的資料不完整
還是,他會 整批不寫入/不更新 ,所以沒差?

2.還是該如何找到源頭,砍掉select 語法,才不會造成 insert /update 資料不完整?

謝謝

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
alien663
iT邦研究生 3 級 ‧ 2023-12-14 10:39:22
最佳解答

1.此時,若去kill
insert /update 的session id
是否會造成 insert /update 的資料不完整
還是,他會 整批不寫入/不更新 ,所以沒差?

你要Rollback,才會整批不寫入。

2.還是該如何找到源頭,砍掉select 語法,才不會造成 insert /update 資料不完整?

我從我的筆記裡面安到的:

找到卡住的Transaction
```sql
SELECT * FROM sys.sysprocesses WHERE open_tran = 1
```

關於Lock的事情,我想更重要的是解決Lock,並理解該如何處理,直接使用nolock可以閃過這部分,但我不建議這樣使用。

高併發系統系列-不得不了解的Isolation Level(by 錢包被扣到變負值)

别混淆数据争用(data race) 和竞态条件(race condition)

看更多先前的回應...收起先前的回應...
noway iT邦研究生 1 級 ‧ 2023-12-16 08:36:54 檢舉

您好:
謝謝.
當下,會想讓LOCK 消失,但 後續仍想找到LOCK 哪一段語法造成的,該如何去找?

有辦法找到 最耗時的語法,來除錯嗎?
找最耗時的語法來處理正確嗎?
還是 有LOCK的歷史資料可找? 因為當下,會想先排除,讓系統可用.

2.您說的
SELECT * FROM sys.sysprocesses WHERE open_tran = 1
是指?

這一句沒有LOCK撈的時就,就有一些資料了

謝謝

alien663 iT邦研究生 3 級 ‧ 2023-12-18 07:54:17 檢舉

要找到Dead Lock的語法,你上網google一下就有了
[https://topic.alibabacloud.com/tc/a/four-ways-to-track-sql-server-deadlock_1_42_30070860.html]https://topic.alibabacloud.com/tc/a/four-ways-to-track-sql-server-deadlock_1_42_30070860.html

如果想讓Dead Lock消失,建議先從語法先開始修改,最後才考慮手動上鎖甚至是修改DB架構。

noway iT邦研究生 1 級 ‧ 2023-12-20 16:50:54 檢舉

您好:
謝謝
想請問
4.使用windows效能計數器檢測到死結再去sql中查詢

命令列輸入:perfmon 或者 perfmon /sys

選擇執行個體:SQL Server :Locks \ Number of DeadLocks/sec \ _Total

這一個 「
選擇執行個體:SQL Server :Locks \ Number of DeadLocks/sec \ _Total

他是指?

alien663 iT邦研究生 3 級 ‧ 2023-12-21 08:01:51 檢舉

https://ithelp.ithome.com.tw/upload/images/20231221/20153982Ru7Nz1kiah.jpg

1
純真的人
iT邦大師 1 級 ‧ 2023-12-13 22:38:10

參考

Select * From a With(NoLock)

只會讀取未被更新的資料~
如果你正在讀取資料~
但是執行了update , insert ,delete
這些後面影響的資料~
不會影響變動正在讀取的資料表

也就是你看到的一定是舊資料~
除非你在重新執行查詢~
才會看到你更新完成的資料~

noway iT邦研究生 1 級 ‧ 2023-12-14 09:50:21 檢舉

不好意思,
目前的問題在於 若我是KILL INSERT/UPDATE 的SESSION
那是否會造成 異動資料錯誤的問題。

一般好像要先找到 最上一個session,KILL
筆如
S1 select 1
S2 select 2
S3 insert X

是否要先找到S1 ,KILL S1
而不能 直接KILL S3 ,造成 寫入資料部分遺失?
感覺不會,想 KILL S3,應該是這一段整批 停掉,還是他會 寫入一部分,另一部份沒有寫入.

關於select session,KILL這方面~的確沒試過~

1
sam0407
iT邦大師 1 級 ‧ 2023-12-14 10:33:31

  基本上是DML指令(Update/Delete/Insert)才會造成造成Lock的主要原因,Select指令是DQL,只是因為要讀的資料被Lock了,所以一直卡在那裡,您砍了Select指令也不會解決問題。

  至於砍掉DML指令會不會造成資料不完整?

  1. 以資料庫層面來說不會,因為資料庫會將未Commit的資料作Rollback。
  2. 以應用程式層面來說則不一定,舉例來說:您新增一筆訂單的資料,應用程式會向資料庫寫入一筆資料到訂單主檔及n筆資料到訂單明細檔,如果應用程式有用Transaction將這些Insert指令都包起來,這樣資料會是完整的。如果應用程式沒有用Transaction,則這筆訂單資料將會少掉您砍掉的那筆。
noway iT邦研究生 1 級 ‧ 2023-12-16 08:12:35 檢舉

您好:
1.若整個 INSERT MASTER+ DETAIL,有包,則 整個ROLLBACK
若沒有包,刪掉MASTER INSERT ,則會有DETAIL 寫入 ?

sam0407 iT邦大師 1 級 ‧ 2023-12-18 13:18:00 檢舉

您說的這種情況,依Detail Table上是否有用Master Table的主鍵作FK,又分為兩種情境:

  1. 有建FK:因為Master Table沒Insert成功,Detail Table受到FK限制,Insert不會成功,Detail Table不會有資料
  2. 沒建FK:就是很糟糕的情形,Master Table沒資料,Detail Table有資料
sam0407 iT邦大師 1 級 ‧ 2023-12-21 14:22:29 檢舉

如果我的回答對您有幫助,可否選我為"最佳解答"?還差3個我就升級了,厚顏拜託,請您幫幫忙喔~~

我要發表回答

立即登入回答