哪种代码适合交易? 我需要检查提交的查询结果吗?
这段代码没什么结果
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 :(得分:1)
可能让您感到困惑的是,在MySQL中发出commit
并不会导致错误地转换为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,正确的顺序如下:
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
}
答案 1 :(得分:0)
我认为调用mysql_query(“COMMIT”)需要通过先前查询的成功来确定。因此,在上面的代码中,没有任何东西被提交给db,因为之前的2个查询之一失败了。