2016-05-15 7 views
0

は私のスクリプトです:PDOトランザクションにはどのようなコードがありますか?ここ

$id = $_GET['id']; 
$value = $_GET['val']; 

// database connection here 

try{ 
    $db_conn->beginTransaction(); 
    // inserting 
    $stm1 = $db_conn->prepare("INSERT into table1 (col) VALUES (?)"); 
    $stm1->execute(array($value)); 

    // updating 
    $stm2 = $db_conn->prepare("UPDATE table2 SET col = "a new row inserted" WHERE id = ?"); 
    $stm2->execute(array($id)); 

    $db_conn->commit(); 
} 
catch(PDOException $e){ 
    $db_conn->rollBack(); 
} 

私が知りたいすべてが、私はbeginTransaction()commit()の間にあるコードでifステートメントを使用することができますか?このようなもの:

$id = $_GET['id']; 
$value = $_GET['val']; 

// database connection here 

try{ 
    $db_conn->beginTransaction(); 
    // inserting 
    $stm1 = $db_conn->prepare("INSERT into table1 (col) VALUES (?)"); 
    $stm1->execute(array($value)); 

    // updating 
    if (/* a condition here */){ 
     $stm2 = $db_conn->prepare("UPDATE table2 SET col = "a new row inserted" WHERE id = ?"); 
     $stm2->execute(array($id)); 
    } 

    $db_conn->commit(); 
} 
catch(PDOException $e){ 
    $db_conn->rollBack(); 
} 

できますか?あなたが早すぎるとのお取引を閉じる可能性があるので

は仕事と危険ですません。


は実際に私がhereはあなたができないと言う文で、それを行うためには危険であることを尋ねましたネストされたcommit()。

+0

は再びそこにコメントをお読みください。彼は言った、あなたは1つしかない間にトランザクションを入れ子にしました。 – Chay22

+0

@ Chay22私はそれを何度か読んだ..問題は私の貧しい英語です..とにかくありがとう。 – stack

+1

ハ、同じ問題があります。 – Chay22

答えて

1

トランザクション内ですべてを行うことができます。唯一行うことはできませんが、ネストトランザクションです。

わけではありませんif句自体は、あなたのリンクのコメントで問題となっているが、実際には内部の別のbeginTransaction/commitのペアがあります。

+0

私の2番目のコード( 'if'文を含む)はいいですか? – stack

+0

ありがとうございます。 – clemens321

+0

ありがとう.. upvote – stack

2

あなたの取引構造の問題はありません。 php.netのコメントは、MySQLがネストしたトランザクションをサポートしていないことを意味しています。一層のご質問へのために、あなたは、任意のデータ(SQL)を照会データ(DML)を操作しますが、ないできる任意のデータベース構造(DDL - データ定義言語)を変更します。

/*won't work*/ 
START TRANSACTION; 
/*statement*/ 
START TRANSACTION; /*nested not supported, auto commit*/ 
/*statement*/ 
COMMIT; 
/*statement dependend on 1st transaction won't work*/ 
COMMIT; 

も参照してくださいMySQL ref

取引を入れ子にすることはできません。これは、START TRANSACTION文またはその同義語の1つを発行するときに、現行のトランザクションに対して暗黙的にコミットされた結果です。

+0

を参照してください。ありがとうございました.. upvote – stack

+0

追加してください、データクエリだけがトランザクションで許可されます。 DDLクエリ(例えば、alter table)は、MySQLによって実行される前にオープントランザクションのコミットを引き起こす。 –

+0

ああ良いところです! – stack

関連する問題