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.
转载自:http://hi.baidu.com/pumpkinnnnnnn/item/b4e0323c21af0288f5e4ada2
posted on 2012-10-23 22:38 pinocchioatbeijing 阅读(1095) 评论(0) 编辑 收藏 举报