PHP mysql与mysqli事务使用说明 分享
mysqli封装了诸如事务等一些高级操作,同时封装了DB操作过程中的很多可用的方法。 应用比较多的地方是 mysqli的事务。 比如下面的示例: 代码如下: $mysqli = new mysqli('localhost','root','','DB_Lib2Test'); 在PHP中,mysqli 已经很好的封装了mysql事务的相关操作。如下示例: 代码如下: $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)"; $mysqli = new mysqli('localhost','DB_Lib2Test'); 在这里,我们再使用 php mysql 系列函数执行事务。 代码如下: $sql1 = "update User set ScoreCount = ScoreCount +10 where ID= '123456'";
$sql2 = "update ScoreDetail set FScore = 300 where ID= '123456'"; $sql3 = "insert into ScoreDetail ID,60)"; $conn = mysql_connect('localhost',''); mysql_query($sql1); // mysql_query('SET autocommit=1'); 在这里要注意, MyISAM:不支持事务,用于只读程序提高性能 但往往,我们需要在使用事务的时候,是需要执行多条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 我们再来举个例子看下。 代码如下: $sql1 = 'create table ScoreDetail_new(id int)'; $sql2 = 'rename table ScoreDetail to ScoreDetail_bak'; $sql3 = 'rename table ScoreDetail_new to ScoreDetail'; $mysqli = new mysqli('localhost','DB_Lib2Test'); 上面的示例中,假如$sql2执行出错了,$sql1照样会执行的。为什么呢? 因为rename在执行的时候,mysql默认会先执行commit,再执行rename。 注意 MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其他的类型是不支持的! ***:一般MYSQL数据库默认的引擎是MyISAM,这种引擎不支持事务!如果要让MYSQL支持事务,可以自己手动修改: 方法如下:1.修改c:/appserv/mysql/my.ini文件,找到skip-InnoDB,在前面加上#,后保存文件。 2.在运行中输入:services.msc,重启mysql服务。 3.到phpmyadmin中,mysql->show engines;(或执行mysql->show variables like 'have_%'; ),查看InnoDB为YES,即表示数据库支持InnoDB了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |