Что может вас смущать, так это то, что выдача 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
}