Транзакция и коммит - PullRequest
2 голосов
/ 25 июня 2011

Какой код подходит для транзакции? мне нужно проверить результат запроса на коммит?

этот код ничего не дает

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");
}
?>

или

этот код русл 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");
    ?>

Ответы [ 2 ]

1 голос
/ 25 июня 2011

Что может вас смущать, так это то, что выдача commit в MySQL не приводит к rollback [все] в случае ошибки.Вместо этого он переводит: commit материал, в котором не было ошибок.

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)

В Postgres, напротив:

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.Он поддерживает такие вещи напрямую:

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

Или PDO:

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

При использовании PDO правильная последовательность будет выглядеть следующим образомthis:

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

Используя MySQLi, вы можете заставить его вести себя так же, как указано выше, с помощью оператора or:

try {
  # begin transaction
  # do stuff or throw new Exception;
  # commit
} catch (Exception $e) {
  # rollback
}
0 голосов
/ 25 июня 2011

Я думаю, что вызов mysql_query ("COMMIT") должен определяться успехом предыдущих запросов. Таким образом, в приведенном выше коде ничто не передается в db, потому что один из 2 предыдущих запросов завершился неудачей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...