如何知道 Transaction 是否成功執行 !? MySQL5 + AdoQuery + Delphi7 |
答題得分者是:sryang
|
UB
一般會員 發表:18 回覆:19 積分:7 註冊:2007-02-19 發送簡訊給我 |
各位大大 ~
小弟有個小小的問題,我現在是使用 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 整個故事就是這樣,說了一堆廢話..... 還請各位大大幫忙解救,看看小弟的問題在哪裡 ! |
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
你的 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/ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |