3

偽造者のトランザクションが、私が期待したとおりに動作しない理由を理解しようとしています。


このトランザクション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 ' を報告します

$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は「AAA」で更新されず、TABLE2は「BBB 」で更新ませ



しかし、このトランザクションのtrans_status()は、値が ' 55 'のIDがなくても' 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は更新されません。TABLE255IDがないためです。

何を与える?トランザクション全体が成功するには、 trans_start()trans_complete( )の間のすべてが成功する必要があるというのが、トランザクションの背後にある考え方だと思いました。それ以外の場合、トランザクション全体がロールバックされます。

SET と UPDATE でこれを試しましたが、同じ問題があります。最初のdb->query()は変更をコミットして保存し、2 番目のdb->query()は満たされないままにし、trans_status()はそれを成功として報告しますか???

ここで何が欠けていますか?

皆さんありがとう :)

よろしく。

4

2 に答える 2

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>";
}
于 2014-07-21T03:25:18.493 に答える
2

成功したクエリを探しているトランザクション。クエリ

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

は適切なクエリであり、それに応じて実行され、0 行が返されます。行が返されなくても、クエリの実行に失敗したわけではありません。

更新クエリの例を提供すると、問題がさらに明らかになる可能性があります。

于 2013-02-05T03:17:20.597 に答える