2016-10-12 13 views
0

私はPDOでMySQL BEGIN/COMMITを使用する方法を知りました。 私はそれがすべてのデータまたはまったくなしのいずれかの挿入は、ここに私のコードはPHP/MySQL - PDOでMySQL BEGIN/COMMITを使用する方法

$query = $db -> prepare 
         (" 
         BEGIN; 
         INSERT INTO chat (chat_id,msg,datetime) 
         VALUES (:cid,:msg,:datetime) 
         INSERT INTO chat_connect (chat_id,sender_id,receiver_id) 
         VALUES (:cid2,:sender_id,:receiver_id); 
         COMMIT; 
         "); 
$query -> execute(array(
      "cid" => $cid, 
      "msg" => $msg, 
      "datetime" => $datetime, 
      "sender_id" => $getid, 
      "receiver_id" => $frid, 
      "cid2" => $cid 
      )); 

答えて

0

トランザクション構文:

のSTART TRANSACTION [transaction_characteristic [、transaction_characteristic] ...]

transaction_characteristic:CONSISTENT SNAPSHOT WITH | READ WRITE | READ ONLY

BEGIN [WORK] COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE] ROLLBACKない [WORK] [AND [NO] CHAIN] [[NO] RELEASE] SETの自動コミット= {0 | 1}

トランザクションの例は:

START TRANSACTION; 
SELECT @A:=SUM(salary) FROM table1 WHERE type=1; 
UPDATE table2 SET [email protected] WHERE type=1; 
COMMIT; 

hereから撮影します。

PDOを使用してtransactionを作成する予定です。それは本当に問題ではありません。あなたはそれに応じてクエリテキストを生成することによって、それを行うことができます。

$query = $db -> prepare 
         (" 
         START TRANSACTION; 
         INSERT INTO chat (chat_id,msg,datetime) 
         VALUES (:cid,:msg,:datetime) 
         INSERT INTO chat_connect (chat_id,sender_id,receiver_id) 
         VALUES (:cid2,:sender_id,:receiver_id); 
         COMMIT; 
         "); 
$query -> execute(array(
      "cid" => $cid, 
      "msg" => $msg, 
      "datetime" => $datetime, 
      "sender_id" => $getid, 
      "receiver_id" => $frid, 
      "cid2" => $cid 
      )); 

Hereあなたは防弾トランザクションを書くことができるかを見ることができます。

0

あなたのコードはonly if emulation mode is turned ONをうまくいくのですデータベース に「一貫性」を提供するために、クエリを作成するのが最善だということを読みました。

それ以外の場合は、このような別の呼び出しでクエリを実行する必要があります。

これは一般的なルールであり、PHPでは複数のクエリ文を実行しています。

ただし、トランザクションの場合、SQLコマンドBEGINCOMMITの代わりにtheir PDO counterpartsを使用できます。

関連する問題