2013-02-05 36 views
3

只是想弄清楚爲什麼僞造者交易行爲不像我預期的那樣。codeigniter交易 - trans_start trans_complete trans_status


此交易TRANS_STATUS()觸發器 'TRANS成功':

$this->db->trans_start(); 
     $this->db->query("UPDATE `TABLE1` SET `NAME` = 'AAA' WHERE `ID` = '1'"); 
     $this->db->query("UPDATE `TABLE2` SET `NAME` = 'BBB' WHERE `ID` = '2'"); 
    $this->db->trans_complete(); 

    if($this->db->trans_status() === FALSE){// Check if transaction result successful 
     echo "<BR>------- TRANS FAILED -------</BR>"; 
    }else{ 
     echo "<BR>------- TRANS SUCCESS -------</BR>"; 
    } 

TABLE1獲取與 'AAA' 和TABLE2更新獲取與「BBB更新'



此交易TRANS_STATUS()報告 'TRANS失敗' 正如所料,因爲 'incorrectID' 一欄確實存在於TABLE2

$this->db->trans_start(); 
    $this->db->query("UPDATE `TABLE1` SET `NAME` = 'AAA' WHERE `ID` = '1'"); 
    $this->db->query("UPDATE `TABLE2` SET `NAME` = 'BBB' WHERE `incorrectID` = '2'"); 
$this->db->trans_complete(); 

if($this->db->trans_status() === FALSE){// Check if transaction result successful 
    echo "<BR>------- TRANS FAILED -------</BR>"; 
}else{ 
    echo "<BR>------- TRANS SUCCESS -------</BR>"; 
} 

TABLE1 IS 與 'AAA' 和TABLE2更新IS 與 'BBB' 更新



然而,這個交易TRANS_STATUS( )報告'TRAN成功 '即使沒有ID與價值' 「TABLE2:?!?!

$this->db->trans_start(); 
    $this->db->query("UPDATE `TABLE1` SET `NAME` = 'AAA' WHERE `ID` = '1'"); 
    $this->db->query("UPDATE `TABLE2` SET `NAME` = 'BBB' WHERE `ID` = '55'"); 
$this->db->trans_complete(); 

if($this->db->trans_status() === FALSE){// Check if transaction result successful 
    echo "<BR>------- TRANS FAILED -------</BR>"; 
}else{ 
    echo "<BR>------- TRANS SUCCESS -------</BR>"; 
} 


TABLE1DOES與更新'AAA'and TABLE2得到更新,因爲有上TABLE2的 NO ID - 但我希望它回滾,因爲TABLE2更新將不會成功。

什麼給?我認爲交易背後的想法是,所有trans_start()trans_complete()必須成功,整個交易才能成功。否則,整個交易回滾

我已經嘗試過SET和UPDATE,並有同樣的問題。 第一DB->查詢()將承諾並保存更改,離開第二DB->查詢()未了和TRANS_STATUS()報告爲成功???

缺少什麼我在這裏?

謝謝大家:)

問候。

+2

我認爲問題可能是Codeigniters事務'$ _trans_status'只有在查詢失敗時被設置爲false。無法返回結果的查詢在代碼工眼中不會失敗。 – Jeemusu

+0

嗯......好吧 - 那麼它不關心交易是否成功完成 - 但交易沒有格式錯誤? – KDawg

+0

我仍然困惑 - 如果我的電話是創建一個記錄怎麼辦 - 我只想繼續交易,如果記錄A創建...如果它不關心,如果實際成功的電話....什麼是點...仍然困惑 - 但感謝您的回覆:) – KDawg

回答

3

什麼交易正在尋找成功的查詢。您的查詢

$this->db->query("SELECT * FROM TABLE2 WHERE ID = 55"); 

是合適的查詢和它相應的運行,返回0行。不返回任何行並不意味着查詢運行失敗。

如果您爲更新查詢提供您的示例,它可能會更清楚地說明此問題。

+0

好點@dakdad - 感謝您指出了。我沒有想到這個簡單的查詢事實。我修改了問題以顯示真正的更新嘗試。只有一個表更新給出一個成功的事務報告的例子 - 但我預計如果不是所有查詢都成功,事務就會失敗。 – KDawg

+0

我認爲codeigniter工作正確 - 我對交易的理解是錯誤的。我認爲@dakdad和Jeemusu的答案都是正確的 - 不成功更新不存在的行是錯誤的 - 因此完整的事務被視爲成功。我僅用MySQL BEGIN和COMMIT事務方法測試了這一點 - 同樣的事情發生了 - 事務沒有失敗,因爲TABLE2上沒有ID'55'。它提交了第一個TABLE1數據並繼續執行交易。我認爲我應該在任何事情之前檢查ID 55是否存在。 – KDawg

+0

我想我只是測試它失敗,趕上失敗的交易 - 並尋找方法導致它失敗並變得困惑......還有什麼是新的:\如果你想修改你的答案來掩蓋交易失敗 - 我會很高興在您回答第一時爲您答覆@dakdad。 – KDawg

2

使用此程序。它以某種方式工作^ _^

$this->db->trans_start(); 
    $this->db->query("UPDATE `TABLE1` SET `NAME` = 'AAA' WHERE `ID` = '1'"); 
    $this->db->query("UPDATE `TABLE2` SET `NAME` = 'BBB' WHERE `ID` = '2'"); 
if($this->db->trans_status() === FALSE){// Check if transaction result successful 
    $this->db->trans_rollback(); 
    echo "<BR>------- TRANS FAILED -------</BR>"; 
}else{ 
    $this->db->trans_complete(); 
    echo "<BR>------- TRANS SUCCESS -------</BR>"; 
} 
+0

您的mySQL數據庫表必須是innodb而不是myISAM。 –