【发布时间】:2013-01-19 21:24:35
【问题描述】:
只是想弄清楚为什么造假者的交易行为不像我预期的那样。
此交易 trans_status() 触发“TRANS SUCCESS”:
$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 FAILED”,因为“incorrectID”列确实NOT 存在于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 是 NOT 更新为 'AAA' 和 TABLE2 是 不更新为“BBB”
然而,即使没有值为 '55 的 ID,此事务 trans_status() 仍会报告“TRANS SUCCESS” ' 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>";
}
TABLE1 确实已更新为 'AAA' 和 TABLE2 不会更新,因为 TABLE2 上没有 55 的 ID - 但我希望它回滚,因为 TABLE2 UPDATE 不会成功。
什么给了?我认为事务背后的想法是 trans_start() 和 trans_complete() 之间的一切都必须成功,整个事务才能成功。否则整个 事务回滚。
我已经用 SET 和 UPDATE 尝试过这个并且有同样的问题。 第一个 db->query() 将提交并保存更改,而第二个 db->query() 未完成,而 trans_status() > 报告成功???
我在这里错过了什么?
谢谢大家:)
问候。
【问题讨论】:
-
我认为问题可能在于 codeigniters transactions
$_trans_status只有在查询失败时才设置为 false。在 codeigniters 眼中,不返回结果的查询并不是失败。 -
Hmmm... 好的 - 那么事务是否成功完成并不关心 - 但事务是否格式不正确?
-
我仍然很困惑 - 如果我的调用是创建记录怎么办 - 我只想在创建记录 A 的情况下继续交易......如果它不关心实际成功是否打电话....有什么意义...仍然很困惑-但感谢您的回复:)
标签: mysql codeigniter transactions status