background image

$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