2014-05-14 23 views
0

我打算爲我初始化數據庫的許多插入語句實現事務。我知道一個事務將允許我們將更改提交到數據庫,從而保存它。或者,如果其中一個插入失敗,我們可以回滾所有可能成功的插入。我的問題是,如何檢測插入語句是否失敗?如何檢測插入過程中是否發生錯誤?

start transaction; 
insert into .. 
insert into .. 
insert into .. 
if (failure) roll back 
else commit. 

進一步解釋,

我有我跑插入一組數據到我的數據庫的SQL腳本文件。我想圍繞這些插入包裝事務,以便在運行時,如果其中一個失敗,那麼在執行任何插入操作之前,我們會回滾到初始狀態。

+0

您檢查每個插入查詢的單個結果。例如如果您是從某些客戶端應用程序執行此操作,例如PHP,你會檢查插入查詢的返回值。如果沒關係,那麼你做另一個插入,等等......一旦完成插入,你做提交。 –

+0

你在做什麼?我的意思是這些存儲過程在MySQL本身? 這是一些連接到數據庫的外部應用程序(就像Marc B問......是這個PHP?)。 – MER

+0

我正在MySQL工作臺上工作 –

回答

1

我更願意在瞭解更多關於您正在使用的內容之後爲您提供答案(請參閱您的問題下面的我的評論)。 但是,一般來說,如果插入失敗,您將收到來自MySQL的錯誤。 另外,一般來說,您應該檢查此故障,然後有條件地(如果您收到故障消息)回滾。 這裏是一個答案類似的問題:Automatic Rollback if COMMIT TRANSACTION is not reached 另外,如果您正在使用存儲過程在這裏工作是一個潛在的有價值的帖子(當然答案是): mysql transaction - roll back on any exception

更具體: 在PHP中任何你正在使用查詢(我推薦PDO)應該返回插入失敗錯誤。如果收到此錯誤,請檢查此錯誤&回滾。 例如您可以使用try catch異常處理構造& catch來獲取PDO特定的錯誤,如果您收到此錯誤,則可以在catch中觸發回滾。

catch(PDOException $e) 
    { 
     echo 'Caught exception: ', $e->getMessage(), "\n"; 
    //verify that it was an insert failure then rollback or just plain rollback becuase you received an error 
    } 

希望有幫助。

+0

使用存儲過程的鏈接正是我所需要的。非常感謝你! –

+0

對不起,我很高興我能夠幫助:) – MER

0

我認爲最好的方法是將輸出記錄到文件中。當您登錄到MySQL時,輸入

tee log.txt 

腳本結束後,您可以檢查該文件。

0

mysql插入或任何dml查詢返回的東西,以指示受影響的行數或任何生成的密鑰。

http://dev.mysql.com/doc/refman/5.6/en/insert.html

甚至在某些情況下,像插入選擇它返回一個描述字符串。所有驅動程序都能夠檢測到任何錯誤。 例如,在Java中,你可以嘗試

嘗試{這裏 插入 這裏提交 }趕上(SQLEXCEPTION) { 回滾這裏 }

這取決於語言和驅動程序,您要使用

相關問題