iT邦幫忙

0

事務(進程 ID 84)與另一個進程被死鎖在 鎖 | 通信緩衝區 資源上,並且已被選作死鎖犧牲品。請重新運行該事務。

c#
  • 分享至 

  • xImage

我寫了一段C#排程器,想要每兩分鐘後執行一段 SQL
通常執行兩天後就會出現這個錯誤,請問我要如何改比較好呢?

while (true)
{
	using (var cn = Db.Connection())
	{
		// Do Some thing
	}
	Thread.Sleep( 2 * 60 * 1000 );
}

image

w4560000 iT邦研究生 5 級 ‧ 2020-09-25 09:42:42 檢舉
SQL 有用transaction嗎?

我遇過這種exception的狀況,我包了Isolation Level Serializable 的transcation
功能是單純的先select資料 再 update資料,問題是發生在兩筆同一時間reqeust進來,又剛好是select出同一筆資料,此時request1 要update時,資料被request2 鎖定,而request2 要update時,又被request1鎖住,變成兩個request再互相等對方處理完,變成deadlock,這時sql server會自己讓一方發生deadlock,另一方繼續執行。
estotw iT邦新手 5 級 ‧ 2020-09-25 15:05:44 檢舉
您好,沒有 transaction
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
japhenchen
iT邦超人 1 級 ‧ 2020-09-25 07:28:57
最佳解答

Windows作業系統會把SLEEP中超過60秒的程式當做是超過60秒沒有回應的程式,會彈出視窗或以陣亡進程處理,如果你不想改成用系統排程設定成2分鐘執行一次,那我建議你這樣改,這樣不會產生假死的狀態

while (true)
{
	using (var cn = Db.Connection())
	{
		// Do Some thing
	}
    
    DateTime sdt = DateTime.Now;
    while((DateTime.Now - sdt).TotalSeconds<2) 
        Application.DoEvents();
}
estotw iT邦新手 5 級 ‧ 2020-09-25 15:04:49 檢舉

感謝按照您的方式,解決問題了!

sleep真的不建議在主進程裡使用,會造成滑鼠鍵盤還有系統內部訊息都沒反應,但多線程化的設計裡,在執行緒(背景任務)裡就多多益善,省的線程多起來整個系統被拖垮
(個人做法,有任何不妥還請噴小力一點)

estotw iT邦新手 5 級 ‧ 2020-09-25 15:25:52 檢舉

是,我當初以為這樣很方便,沒想到採到坑

1

一般不建議用sleep跟無限回圈一直跑進程。
很容易被卡記憶體。

如果是2分運行一次。我倒是會建議你用crontab之類的東西跑。
一般會寫成無限回圈的是因為得要用秒級為單位的情況下才需要這樣做。
畢竟計劃任務最低只能依分為單位。

而且就算真的要無限回圈。也最好規劃成單一線程處理。或是中斷重啟等動作。

estotw iT邦新手 5 級 ‧ 2020-09-25 15:05:22 檢舉

感謝您!

我要發表回答

立即登入回答