2016-05-06 6 views
2

私はいくつかの機能をいくつかのものを更新し、いくつかの挿入を削除する別の関数の中で使用しています。上記の2つが成功した場合、またはそれ以外の場合は致命的な結果を引き起こす可能性があります。複数の関数間でsqlトランザクションを1つにすることは可能ですか?

public static function do_stuff() 
{ 
    //run sql in function 
    SELF::function_sql_one_insert(); 

    SELF::function_sql_two_update(); 

    SELF::function_sql_three_delete(); 
} 

ので、同様::だからたとえば...すべての3つの機能のために1つのトランザクションを使用することも可能である

public static function test() 
{ 
    SELF::function_sql_one_insert(); 

    SELF::function_sql_two_update(); 

    SELF::function_sql_three_delete(); 
} 

public static function function_sql_one_insert() 
{ 
    //sql to run 
    $sql = "INSERT INTO table 
      (
       fake_row_one, 
       fake_row_two 
      ) 
      VALUES 
      (
       ?, 
       ? 
      )"; 

    //run sql 
    $fake_insert = $database->prepare($sql); 
    $fake_insert->execute("yeah", "okay"); 
} 

public static function function_sql_two_update() 
{ 
    //sql to run 
    $sql = "UPDATE table 
      SET fake_row_one = ? 
      WHERE fake_row_two = ?"; 

    //run sql 
    $fake_update = $database->prepare($sql); 
    $fake_update->execute("blahblah", "okay"); 
} 

public static function function_sql_three_delete() 
{ 
    //sql to run 
    $sql = "DELETE FROM TABLE 
      WHERE fake_row_two = ?"; 

    //run sql 
    $fake_delete = $database->prepare($sql); 
    $fake_delete->execute("okay"); 
} 

何1が戻ってそれらのすべてを元に戻す失敗した場合、私はあるacomplishしようとしています。これは可能ですか?代わりに私が何をすることができない場合、もしそうなら、これには何か反対がありますか?すべての機能のためにこれを試してみてください

$working = true; 
try 
{ 
    SELF::function_sql_one_insert(); 
} catch (Exception $e) 
{ 
    if($e != "") 
     $working = false; 
} 

+0

あなたがhttp://php.net/manual/en/pdoを読みました。 begintransaction.php? – Mike

+0

ええ、関数を実行する前にトランザクションを開始してからコミットする必要があります。内部関数がブール値成功インジケータを返し、必要に応じてそれに基づいてロールバックすることができます。 –

+0

私はSQL関数を実行しているメイン関数または3つのトランザクションでトランザクションを開始する必要がありますか? – 4334738290

答えて

-1

たぶん、あなたはこのような何かを試すことができます。 $ workingがtrueの場合は、すべてのコマンドを実行できます。

+0

'try ... catch'はデータベーストランザクションの代用としては役に立たないと思います。 –

0

php関数は、データベーストランザクションとはまったく関係ありません。それはちょうど無関係の問題です。

データベーストランザクションは、データベース接続にのみバインドされます。したがって、すべての関数が同じ接続を使用している限り、3つすべてをトランザクションで実行することは問題ありません。

0

これにはデータベーストランザクションを使用する必要があります。

基本的に、

  1. あなたがあなたのSQLは、それがどこかに障害が発生した場合、あなたがロールバックを行うと、そうでない場合は、あなたが

をコミットしない

  • を照会しかし、やる
  • 、トランザクションを開始あなた自身がコミットする特定のSQL文など、いくつかの問題があります。使用しているデータベースの公式ドキュメントをすべて読んでください。

    さらに詳しい情報:http://php.net/manual/en/pdo.begintransaction.php

    しかし、すべてのデータベースがで開始するトランザクションをサポートすることを覚えておいてください。 など。 MySQLのMyISAMテーブルはトランザクションをサポートしていません。あなたはInnoDBテーブルにこれらのテーブルを変換したい場合があります

    は、例えばここを参照してください:How to convert all tables from MyISAM into InnoDB?

  • 0

    私はこの方法を使用します。

    class Teste { 
    public $mysqli; 
    public $erro = array(); 
    
         public function __construct(){ 
         $this->mysqli = new \mysqli(DB_HOST,DB_USERNAME,DB_PASSWORD,DATABASE); 
         $this->mysqli->set_charset("utf8"); 
         } 
    
         public function start_trans(){ 
          $this->mysqli->autocommit(false); 
         } 
    
         public function end_trans(){ 
    
          if(count($this->erro) == 0){ 
          $this->mysqli->commit(); 
          echo "success"; 
          } else { 
          $this->mysqli->rollback(); 
          echo "error"; 
          } 
    
         } 
    
    
         public function example1(){ 
    
          $stmt = $this->mysqli->query("insert into veiculos (placa, modelo) values (1,1)"); 
    
          if(!$stmt){ 
          $this->erro[] = "Erro #143309082017 <code>" . $this->mysqli->error . "</code>"; 
          } 
    
          return (count($this->erro) < 1)? true : false; 
    
         } 
    
    
         public function example2(){ 
    
          $stmt = $this->mysqli->query("insert into veiculos (placa, modelo) values (2,2)"); 
    
          if(!$stmt){ 
          $this->erro[] = "Erro #143309082017 <code>" . $this->mysqli->error . "</code>"; 
          } 
    
          return (count($this->erro) < 1)? true : false; 
    
         } 
    
    
         public function example3(){ 
    
          $this->mysqli->autocommit(false); 
    
          $stmt = $this->mysqli->query("insert into veiculos (placa, modelo) values (3,3)"); 
    
          if(!$stmt){ 
          $this->erro[] = "Erro #143309082017 <code>" . $this->mysqli->error . "</code>"; 
          } 
    
          return (count($this->erro) < 1)? true : false; 
    
         } 
    } 
    
    
         $action = new Teste; 
    
         $action->start_trans(); 
    
         $action->example1(); 
         $action->example2(); 
         $action->example3(); 
    
         $action->end_trans(); 
    
    関連する問題