PHP+MySQL中Transaction的实现

PHP可以方便的使用MySQLi扩展实现事务处理. 在PHP manual中有如下简单范例.

<?php
$mysqli 
= new mysqli("localhost""my_user""my_password""world");

/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n"mysqli_connect_error());
exit();
}

/* disable autocommit */
$mysqli->autocommit(FALSE);

$mysqli->query("CREATE TABLE myCity LIKE City");
$mysqli->query("ALTER TABLE myCity Type=InnoDB");
$mysqli->query("INSERT INTO myCity SELECT * FROM City LIMIT 50");

/* commit insert */
$mysqli->commit();

/* delete all rows */
$mysqli->query("DELETE FROM myCity");

if (
$result $mysqli->query("SELECT COUNT(*) FROM myCity")) {
$row $result->fetch_row();
printf("%d rows in table myCity.\n"$row[0]);
/* Free result */
$result->close();
}

/* Rollback */
$mysqli->rollback();

if (
$result $mysqli->query("SELECT COUNT(*) FROM myCity")) {
$row $result->fetch_row();
printf("%d rows in table myCity (after rollback).\n"$row[0]);
/* Free result */
$result->close();
}

/* Drop table myCity */
$mysqli->query("DROP TABLE myCity");

$mysqli->close();
?>


即先将autocommit设置为FALSE. 这样无论使用query() 还是 prepare(), 都不会对数据库进行真实的操作, 直到调用commit()方法. 在commit方法被调用之前, 如果调用rollback()方法, 则能够回滚本次事务.


然而在第一次使用时, rollback一直无效, 这个问题纠缠了我两个小时. 后来才在资料中看到如下解释:

"在mysql下默认的是MyISAM存储引擎,它是一个非事务型的存储引擎,成为了MYSQL的缺省存储引擎。要想在mysql的表中支持transaction,必须要求是innodb表,而不是MyISAM。"


注意到官方示例中也有如下语句, 将表设置为innodb.

$mysqli->query("ALTER TABLE myCity Type=InnoDB");


因此需要注意, 在MySQL中进行事务处理前, 需要将表设置为innodb.

阅读全文
类别:Sql 查看评论
posted @ 2010-08-05 17:28  普兒  阅读(2882)  评论(0编辑  收藏  举报