打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
潘少宁的博客 ? php mysql事务详解

php mysql事务详解

在说php mysql事务之前,可以先了解下 php mysql与mysqli 区别

在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','root','','DB_Lib2Test');$mysqli->autocommit(false);//开始事物$mysqli->query($sql1);$mysqli->query($sql2);if(!$mysqli->errno){  $mysqli->commit();  echo 'ok';}else{ echo 'err';  $mysqli->rollback();}

在这里,我们再使用 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,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);

在这里要注意,

  1. MyISAM:不支持事务,用于只读程序提高性能
  2. InnoDB:支持ACID事务、行级锁、并发
  3. 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 FUNCTIONALTER PROCEDUREALTER TABLEBEGINCREATE DATABASECREATE FUNCTIONCREATE INDEXCREATE PROCEDURECREATE TABLEDROP DATABASEDROP FUNCTIONDROP INDEXDROP PROCEDUREDROP TABLEUNLOCK TABLESLOAD MASTER DATALOCK TABLESRENAME TABLETRUNCATE TABLESET AUTOCOMMIT=1START TRANSACTION

我们再来举个例子看下。

$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','root','','DB_Lib2Test');$mysqli->autocommit(false);//开始事物$mysqli->query($sql1);$mysqli->query($sql2);$mysqli->query($sql3);if(!$mysqli->errno){  $mysqli->commit();  echo 'ok';}else{ echo 'err';  $mysqli->rollback();}

在上面的示例中,假如$sql2执行出错了,$sql1照样会执行的。为什么呢?
因为rename在执行的时候,mysql默认会先执行commit,再执行rename。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
MySQL学习——管理事务
Mysql使用优化之处(转)
PHP对MYSQL数据库进行事务处理及表锁定_PHPer
MYSQL--事务处理
简单 PHP + MySQL 数据库动态网站制作 | renfei song's blog
MySQL丨PHP 获取查询结果
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服