當 Deadlock 發生時,使用disconnect 無法結束 SQL 的連線 |
答題得分者是:GrandRURU
|
etjon
一般會員 發表:14 回覆:12 積分:5 註冊:2002-03-12 發送簡訊給我 |
我固意更新資料表,開2隻APP模擬 SQL Deadlock ,當 Deadlock 發生時,使用disconnect 無法結束 SQL 的連線,只要發生一次Deadlock ,即會多一條連線,除非將程式結束,否則連線會一直存在,Why
if(db.Connect(L"Pooling=False\r\nDriverName=MSSQL\r\nLibraryName=dbxmss.dll\r\nBlobSize=-1\r\nHostName=192.168.1.179\r\nDataBase=MvdisCenter\r\nUser_Name=sa\r\nPassword=5502829\r\nPrepare SQL=False\r\nConnectTimeout=60\r\n")) { strSql; strSql.sprintf(L"SET LOCK_TIMEOUT 5;SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;BEGIN TRAN DECLARE @i INT;SELECT @i = IpClassA FROM FileDsp_Onlines WHERE ClientIp = '192.168.1.180';WAITFOR DELAY '00:00:10';UPDATE FileDsp_Onlines SET IpClassA = 1000 WHERE ClientIp = '192.168.1.180'; COMMIT TRAN"); db.ExecSQL( db.SQLQuery1,strSql.w_str()); if(!db.dbcon->Connected) { Memo1->Lines->Add(L"false"); } } db.Disconnect(); <-- 只要模擬出資料發生 Deadlock 即始 Disconnect 也無效,每發生一次即多一條連線 試過 ADO 不會如此. } |
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
|
etjon
一般會員 發表:14 回覆:12 積分:5 註冊:2002-03-12 發送簡訊給我 |
===================引 用 GrandRURU 文 章=================== 一、執行 execsql 發生 deadlock 時,如果 DB 沒有設定 deadlock 出錯誤訊息,就只能等 SQLQuery Timeout 了 二、要避免 deadlock ,可以用 DBX 的 Transcation 機制 如果你是用微軟資料庫,那就用 ADO 吧 1.請問 DbExpress 不是比ADO 好嗎?Embarcadero 在後期不是建議用 DbExpress 所以我才轉成此方式來處理,是不是真的問題很多,但底層不是直接使用 SQL Driver 所以速度會比較快嗎?還是我的見解有錯呢? 2.因目前追到 .pas 的原始碼查看都有做 disconnect 的動作,怪即不會斷線,如果真的是如此那可能要改成 ADO了~~ |
etjon
一般會員 發表:14 回覆:12 積分:5 註冊:2002-03-12 發送簡訊給我 |
|
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
好奇的問一下,怎麼不考慮使用 Dbexpress 自帶的 Transcation ?
===================引 用 etjon 文 章=================== 自己回覆了. 經測試使用DBExpress 遇到此問題時,連線不會中斷,甚至每多下Select 的語法會多一條連線,長時間後會發生一堆連線一直連至SQL , 造成 SQL 伺服器最後無法再連線,這是我實際測試的結果,所以最後使用ADO 完全無此問題,開發環境是 XE2,XE5的DBexpress 都相同. 不敢再用了. |
etjon
一般會員 發表:14 回覆:12 積分:5 註冊:2002-03-12 發送簡訊給我 |
(1).因為我的SQL更新語法只有一句 UPdate 或 Delete ,如果使用交易查看很多資料,都說不需要,另外使用交易後,我的量很大可能同時會有1500 ~ 2000 個客戶端回報狀況,
交易一開始的 beginTXXX 即會鎖定,怕效能又不好,另外在UPDATE 時有加 With(RowLock) (2).經測試的結果我懷疑是DbExpress 底層的問題,又加上DbExpress 又沒有 connnectTimeout 這個功能,詢問原廠, https://forums.embarcadero.com/thread.jspa?threadID=88174 (3).另外我同事有測試過即始有加交易,還有有機會造成鎖定的問題,如同底下的網址,但我實際使用底下的方式來解決還是會發生,SQL 原廠造知是很正常的,但Dbexpress 即不會釋放, http://blog.darkthread.net/post-2012-12-20-single-table-deadlock.aspx 造成問題,但ADO Lock 過後連線數還是 1 條,所以我只好放棄 dbexpress 以上是我個人經驗,不知是否有錯可以討論看看,因DbExpress 好像最近到了XE5,XE6後李維己不在推展,使用新的元件,所以我放棄了~~DbExpress |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |