2011-06-25 14 views
2

どのコードがトランザクションに適していますか? コミットのクエリ結果を確認する必要がありますか?トランザクションとコミット

このコードの結果は何も

mysql_query("BEGIN"); 
$strSQL = "INSERT INTO table values"; 
$strSQL .="('','a')"; 
$objQuery1 = mysql_query($strSQL); 
$strSQL = "INSERT INTO table values"; 
$strSQL .="('','a','a')"; 
$objQuery2 = mysql_query($strSQL); 
if(($objQuery1) and ($objQuery2)) 
{ 
mysql_query("COMMIT"); 
echo "Save Done."; 
} 
else 
{ 
mysql_query("ROLLBACK"); 
} 
?> 

または

このコードrusult 1つのインサート。なぜ?コミットはエラーを認識しないでしょうか?あなたを混乱される可能性がありますどのような

<?php 
    mysql_query("BEGIN"); 
    $strSQL = "INSERT INTO table values"; 
    $strSQL .="('','a')"; 
    $objQuery1 = mysql_query($strSQL); 
    $strSQL = "INSERT INTO table values"; 
    $strSQL .="('','a','a')"; 
    $objQuery2 = mysql_query($strSQL); 
    mysql_query("COMMIT"); 
    ?> 
+0

InnoDBまたはMyISAMテーブルを使用していますか? – nos

+2

テーブルはInnoDB – user677900

答えて

1

は、MySQLでcommitを発行してもエラーにrollback [すべて]に変換しないということです。代わりに、commitのエラーがないものに変換されます。 Postgresので

mysql> create table test (id int unique); 
Query OK, 0 rows affected (0.10 sec) 

mysql> begin; 
Query OK, 0 rows affected (0.00 sec) 

mysql> insert into test values (1); 
Query OK, 1 row affected (0.00 sec) 

mysql> insert into test values (1); 
ERROR 1062 (23000): Duplicate entry '1' for key 'id' 
mysql> commit; 
Query OK, 0 rows affected (0.00 sec) 

mysql> select * from test; 
+------+ 
| id | 
+------+ 
| 1 | 
+------+ 
1 row in set (0.00 sec) 

、コントラストによって:別のノートで

test=# create table test (id int unique); 
NOTICE: CREATE TABLE/UNIQUE will create implicit index "test_id_key" for table "test" 
CREATE TABLE 
test=# begin; 
BEGIN 
test=# insert into test values (1); 
INSERT 0 1 
test=# insert into test values (1); 
ERROR: duplicate key value violates unique constraint "test_id_key" 
DETAIL: Key (id)=(1) already exists. 
test=# commit; 
ROLLBACK 
test=# select * from test; 
id 
---- 
(0 rows) 

、代わりにmysqliのを使用することを検討してください。 、

try { 
    # begin transaction 
    # do stuff 
    # commit 
} catch (Exception $e) { 
    # rollback 
} 

がMySQLiを使用:

http://www.php.net/manual/en/mysqli.commit.php

またはPDO :: PDOを使用して

http://php.net/manual/en/pdo.commit.php

は、正しい順序は次のようになります。それは、この直接原料の種類をサポートしていますor演算子を使用しても上記のように動作させることができます。

try { 
    # begin transaction 
    # do stuff or throw new Exception; 
    # commit 
} catch (Exception $e) { 
    # rollback 
} 
+0

plz詳細です。何がmysqlをサポートしていませんか? – user677900

+0

mysqlライブラリは一種のものです。それは私が覚えている限り、それはPHPのドキュメントがこれを明確にしないように役立つことはありませんでした。問題は、古いphp/mysqlの例がすべてWeb上にあることです。新しいユーザーが何かに切り替える頃には、mysqlライブラリを使用して、ブログ投稿、チュートリアル、サンプルなどを寄稿してきました。悪質なサークルです... –

0

私はmysql_query( "COMMIT")の呼び出しは以前のクエリの成功によって決定される必要があると思います。したがって、上記のコードでは、前の2つのクエリのうちの1つが失敗するため、dbには何もコミットされません。

+0

私は2番目のコードをテストして結果を見ることができます。ありがとうございました – user677900

関連する問題