$sql1
= "update User set ScoreCount = ScoreCount +10 where ID= '123456'";
$sql2
= "update ScoreDetail set FScore = 300 where ID= '123456'";
$sql3
= "insert into ScoreDetail ID,Score) values ('123456',60)";
$conn
= mysql_connect('localhost','root','');
mysql_select_db('DB_Lib2Test');
mysql_query('start transaction');
//mysql_query('SET autocommit=0');
mysql_query(
$sql1
);
mysql_query(
$sql2
);
if
(mysql_errno()) {
mysql_query('rollback');
echo
'err';
}
else
{
mysql_query('commit');
echo
'ok';
}
// mysql_query('SET autocommit=1');
// mysql_query($sql3);
在这里要注意,
MyISAM:不支持事务,用于只读程序提高性能
InnoDB:支持 ACID 事务、行级锁、并发
Berkeley DB:支持事务
还有一点要注意:
MySQL 默认的行为是在每条 SQL 语句执行后执行一个 COMMIT 语句,
从而有效的将每条语句独立为一个事务。
但往往,我们需要在使用事务的时候,是需要执行多条
sql 语句的。这就需要我们手动设置
MySQL 的 autocommit 属性为 0,默认为 1。
同时,使用
START TRANSACTION 语句显式的打开一个事务 。如上面的示例。
如果不这样做,会有什么结果呢?
我们将上面第二段代码中
//mysql_query(‘SET autocommit=0′); 和 // mysql_query($sql3); 注释
去掉,然后执行。
此时,
mysql_query(
$sql3
) 执行就不会 insert 到数据库中。
如果我们将
// mysql_query(‘SET autocommit=1′); 本句注释去掉,那么 mysql_query($sql3);
就会执行成功。
通常
COMMIT 或 ROLLBACK 语句执行时才完成一个事务,但是有些 DDL 语句等会隐式
触发
COMMIT。
比如下列语句
ALTER FUNCTION
ALTER PROCEDURE
ALTER TABLE
BEGIN
CREATE DATABASE
CREATE FUNCTION
CREATE INDEX
CREATE PROCEDURE