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

如何知道 Transaction 是否成功執行 !? MySQL5 + AdoQuery + Delphi7

答題得分者是:sryang
UB
一般會員


發表:18
回覆:19
積分:7
註冊:2007-02-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-09-09 15:06:03 IP:211.76.xxx.xxx 訂閱
各位大大 ~
小弟有個小小的問題,我現在是使用 Delphi7 MySQL5
簡單的把問題說明一下,假設我現在有個Transaction 如下:
BEGIN;
insert into stock_big_three(`date`,`mer_code`,`buy`,`sell`) values("20070907","52467","1000","2000");
insert into stock_big_three(`date`,`mer_code`,`buy`,`sell`) values("20070907","52801","1378","2660");
COMMIT;

我用 ADOQuery 送過去了 !!
一切都沒有問題,但是我需要知道,這個Tansaction 是成功的 COMMIT了,還是失敗了!!
因為我發現不管有沒有成功的COMMIT, Delphi 都已經成功的把資料傳給MySQL,所以就算是沒有成功的COMMIT,他也不會有錯誤的訊息!!
所以我想要請問各位大大,該如何才能知道這個Transaction 是成功的COMMIT了還是沒有 !!

另外,我在問一個小問題,如果他沒有COMMIT 成功的話,有沒有一個簡單的指令可以直接跳出 Procedure !?

天啊 ~ 剛剛發現了另我震驚的大問題 !!
小弟我的 Transaction 形同廢物 !!
剛剛檢查了一下,Transaction update過的資料,結果發現居然並沒有全部都 Update, 只有一部份有成功,在我小小的腦袋瓜裡一直以為我的程式,不是全部都成功的執行,就是全部都沒有執行(因為我用了 Transaction),可是剛剛發現事情並不是如此的 !!
從千多筆資料裡面 Random 的抓幾個出來做人工檢查,結果發現資料有問題,後來慢慢Trace回去才發現,我的Transaction 在遇到錯誤之前都成功的執行了,但是遇到了錯誤之後的全部都沒有執行,這個好像有違反我的Transaction 的宗旨 !!
不曉得我哪裡出現問題了 !! 還有請各位大大幫我猜測看看哪裡出問題了 !?


我補充一下我的環境 :
MySQL : 5.0.41-community-nt
MyODBC : 3.51.19
Delphi 7
使用 ADOQuery ADOConnection

發生update不完全的SQL 例子:
BEGINl;
update stock_big_three set `buy` = '0',`sell` = '2000' where (`mer_code` = '61904') and (`date` = '20070907');
insert into stock_big_three(`date`,`mer_code`,`buy`,`sell`) values('20070907','*','輪軸','3000');
update stock_big_three set `buy` = '300',`sell` = '861' where (`mer_code` = '52448') and (`date` = '20070907');

COMMIT;
其中第二個 insert 有錯誤,因為他的 mer_code 和 buy 應該都是整數,所以他發生錯誤! 這個錯誤會發生是因為我Parse 資料時,資料並沒有統一,所以發生的例外,因為我Parse 資料時會先檢查資料庫看看這個Merchandise(貨物) 有沒有存在,也就是檢查他的mer_code,如果發現mer_code不存在,就會用Insert的方式,不然就用update的方式,但是,因為資料格式沒有統一,而出現這個漏網之魚,他其實是存在於資料庫的,但是parse出來卻以為他不存在,這還沒有關係,parse出來的資料和要insert的資料格式不符合,所以才會發現這個問題(好險不符合,不然我就永遠不會發現這個問題),anyway 整個故事就是這樣,說了一堆廢話.....

還請各位大大幫忙解救,看看小弟的問題在哪裡 !

編輯記錄
UB 重新編輯於 2007-09-09 16:13:39, 註解 無‧
UB 重新編輯於 2007-09-09 16:31:01, 註解 無‧
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-09-11 10:17:30 IP:59.125.xxx.xxx 訂閱
你的 SQL 中既沒有偵測錯誤,也沒有做 ROLLBACK,不是完整的交易控制
是不是先找一下 MySQL 如何偵測 SQL 是否執行成功?以及控制流程該如何寫呢?

既然你用了 ADO 元件組,那麼何不試試用 ADO 來控制 Transaction 呢?
<textarea cols="100" rows="15" class="delphi" name="code">ADOConnection1.BeginTrans;
try
ADOCommand1.CommandText :=
'insert into stock_big_three(`date`,`mer_code`,`buy`,`sell`) values("20070907","52467","1000","2000")';
ADOCommand1.Execute;
ADOCommand1.CommandText :=
'insert into stock_big_three(`date`,`mer_code`,`buy`,`sell`) values("20070907","52801","1378","2660")';
ADOCommand1.Execute;
ADOConnection1.Commit;
ShowMessage('成功');
except
ADOConnection1.RollBack;
ShowMessage('失敗');
end;
</textarea>
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
系統時間:2024-05-21 7:08:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!