【问题标题】:codeigniter transactions - trans_start trans_complete trans_statuscodeigniter 事务 - trans_start trans_complete trans_status
【发布时间】: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>";
}

TABLE1NOT 更新为 '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 上没有 55ID - 但我希望它回滚,因为 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


【解决方案1】:

哪些事务正在寻找成功的查询。您的查询

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

是一个正确的查询,它会相应地运行并返回 0 行。不返回任何行并不意味着查询运行失败。

如果您提供更新查询的示例,它可能会更清楚地说明问题。

【讨论】:

  • 好点@dakdad - 感谢您指出这一点。通过简单的查询,我没有想到这个事实。我修改了问题以显示真正的更新尝试。只有一个表更新的示例给出了成功的事务报告 - 但如果不是所有查询都成功,我希望事务失败。
  • 我认为 codeigniter 工作正常 - 我对交易的理解是错误的。我认为@dakdad 和 Jeemusu 的答案都是正确的——没有成功更新不存在的行并不是错误——所以完整的交易被视为成功。我单独使用 MySQL BEGIN 和 COMMIT 事务方法对此进行了测试——同样的事情发生了——事务没有失败,因为 TABLE2 上没有 ID '55'。它提交了第一个 TABLE1 数据并继续提交事务。我认为我应该先检查 ID 55 是否存在。
  • 我想我只是在测试它是否失败,以捕捉失败的交易 - 并寻找导致它失败并变得混乱的方法......还有什么新的:\如果你想修改您的回答涵盖了交易失败的含义-我很乐意将答案归功于您@dakdad-正如您首先回答的那样。
  • 我仍然有点困惑这将如何与创建记录一起工作。您不想确保在进行下一个操作之前创建了一条记录吗?
  • @KDawg 通常,如果其中一个查询失败,事务用于回滚一系列查询。正如@Jeemusu 所指出的,返回空的结果集或 0 个受影响的行并不意味着您的查询失败。它根本没有做任何事情。也许你最好寻找$this-&gt;db-&gt;affected_rows()函数ellislab.com/codeigniter/user-guide/database/helpers.html所以,如果你预计一定数量的行会受到影响,如果受影响的行是0,你可以回滚。我仍然认为你需要查看应用程序仔细逻辑并首先锻炼数据流:)
【解决方案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>";
}

【讨论】:

  • 你的 mySQL 数据库表必须是 innodb 而不是 myISAM。
猜你喜欢
  • 2019-05-03
  • 1970-01-01
  • 2014-07-10
  • 2013-02-19
  • 2018-01-13
  • 1970-01-01
  • 2016-02-10
  • 2015-11-03
相关资源
最近更新 更多