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

有關transaction的問題

尚未結案
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-11-17 16:16:23 IP:61.221.xxx.xxx 未訂閱
小弟的環境是D7 MS SQL2000 win2003 小弟在使用SQL的Stored Procedure(採用ADOStoredProc元件) 來處理過帳的動作,假設一張單據有master(Q1)/detail(Q2), 小弟目前的寫法是: 假設有三個SP要處理 Q2.First; while not Q2.Eof do begin ...給相關參數 ADOSP1.ExecProc; ADOSP2.ExecProc; ADOSP3.ExecProc; Q2.Next; end; 目前並沒有加入Transaction 的機制,因為會有幾個問題 1.如果我在每個SP包Transaction的話,萬一其中一筆資料處理失敗就無法RollBack了 2.如果在while 的外圍包Transaction,也不對,如果我的三個SP有互相影響的table的話,會被lock住,也不能用NOLock的方式會有很大的風險。 請問各位大大有更好的意見嗎??
------
ivankuo
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-11-17 21:29:23 IP:61.62.xxx.xxx 未訂閱
可以的話, 建議你將所有的 transaction 寫在 stored procedure 中, 比較容易控制並減少資料庫資源的消耗. 而三個 stored procedure 是否可以並為一個處理呢, 當然 transaction 中是會同時影響異動的資料表沒錯的, 但不至於會產生 deadlock 的. 另外你的 transaction 是在這個 Q2 的迴圈外還是在迴圈內呢?
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-11-18 15:48:43 IP:61.221.xxx.xxx 未訂閱
應該是把transaction寫在迴圈內吧,要不然寫在回圈外面的話ADOSP1...可以允許一次批次commit嗎?? 我的想法還想把Q2的回圈也丟給stored procedure 來做,全部都由SQL來控制transaction
------
ivankuo
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-11-18 18:23:38 IP:203.95.xxx.xxx 未訂閱
其實都可以的. 不過就弟的想法來看. 若是有 transaction 考量的, 最好是採用 stored procedure 來處理會好的多. 而且效能上會更好, 而不會在 delphi 中的迴圈佔用時間!!
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-11-18 18:30:47 IP:61.221.xxx.xxx 未訂閱
感謝timhuang的意見,大概知道怎樣去處理了,若還有問題會再請教。
------
ivankuo
系統時間:2024-07-01 2:53:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!