全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:5443
推到 Plurk!
推到 Facebook!

當 Deadlock 發生時,使用disconnect 無法結束 SQL 的連線

答題得分者是:GrandRURU
etjon
一般會員


發表:14
回覆:12
積分:5
註冊:2002-03-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2014-01-24 18:20:25 IP:59.120.xxx.xxx 訂閱
我固意更新資料表,開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 不會如此.
}

附加檔案:52e23e69e905e_testDb.rar
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2014-01-24 23:03:27 IP:211.79.xxx.xxx 訂閱
一、執行 execsql 發生 deadlock 時,如果 DB 沒有設定 deadlock 出錯誤訊息,就只能等 SQLQuery Timeout 了

二、要避免 deadlock ,可以用 DBX 的 Transcation 機制


如果你是用微軟資料庫,那就用 ADO 吧
etjon
一般會員


發表:14
回覆:12
積分:5
註冊:2002-03-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2014-01-24 23:40:20 IP:218.173.xxx.xxx 訂閱

===================引 用 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2014-05-04 13:13:47 IP:1.174.xxx.xxx 訂閱
自己回覆了.
經測試使用DBExpress 遇到此問題時,連線不會中斷,甚至每多下Select 的語法會多一條連線,長時間後會發生一堆連線一直連至SQL ,
造成 SQL 伺服器最後無法再連線,這是我實際測試的結果,所以最後使用ADO 完全無此問題,開發環境是 XE2,XE5的DBexpress 都相同.
不敢再用了.
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2014-05-06 08:45:20 IP:59.120.xxx.xxx 訂閱
好奇的問一下,怎麼不考慮使用 Dbexpress 自帶的 Transcation ?


===================引 用 etjon 文 章===================
自己回覆了.
經測試使用DBExpress 遇到此問題時,連線不會中斷,甚至每多下Select 的語法會多一條連線,長時間後會發生一堆連線一直連至SQL ,
造成 SQL 伺服器最後無法再連線,這是我實際測試的結果,所以最後使用ADO 完全無此問題,開發環境是 XE2,XE5的DBexpress 都相同.
不敢再用了.
etjon
一般會員


發表:14
回覆:12
積分:5
註冊:2002-03-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2014-05-06 11:11:58 IP:218.173.xxx.xxx 訂閱
(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
系統時間:2024-11-21 16:51:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!