代码说

code is poetry

代码说    
碎碎念:和我一起翱翔在那片无边的天际,一起看见那许多命运惊奇和神秘般的人生绮丽 --- 街角的蔷薇。  换一换

php中使用mysql的事务处理

作者:coderzheng 发布于:2015-8-3 19:44 Monday 分类:php  阅读模式

考虑下面的场景:某次业务逻辑需要连续操作两个表A和B,假设对A的操作为doA,对B的操作为doB。那么仅当doA和doB均成功时,程序才继续向后执行。并且,doA和doB中任何一个操作不成功,都要进行"回滚"。很明显,这种操作具有典型的"原子性",属于数据库事务处理的范畴。
php中实现事务处理有下面两种方式:
1) 事务处理方式1(注意只有innodb类型引擎的表才能使用事务的功能!!!)
这种方式会尝试先执行sql语句,遇到错误再撤销之前的操作(但是实际上已经改变了auto increment id的值)
$conn = mysql_connect('localhost','root','*****') or die('fail to connect db!');
mysql_select_db('test', $conn);
mysql_query("set names 'GBK'");

mysql_query("BEGIN");
$sql = "INSERT INTO `news`(`id`,`title`,`slug`,`text`,`imgUrl`) values(NULL,'test1','1','text','')";
$sql2 = "INSERT INTO `news`(`id`,`title`,`slug`,`text`,`imgUrl`) values(NULL,'test12','2','text2','')";
$res = mysql_query($sql);
$res2 = mysql_query($sql2);
if ($res && $res2) {
     mysql_query("COMMIT");
     echo "OK";
} else {
     mysql_query("ROLLBACK");
     echo "NOT OK";
}
mysql_query("END");

2) 事务处理方式2(关闭mysql的自动提交模式)
这种方式不会尝试先执行sql语句, 而是先检测sql语句的可行性(不会影响自增ID)
$conn = mysql_connect('localhost','root','*****') or die('fail to connect db!');
mysql_select_db('test', $conn);
mysql_query("set names 'GBK'");
mysql_query("SET AUTOCOMMIT=0");
$sql = "INSERT INTO `news`(`id`,`title`,`slug`,`text`,`imgUrl`) values(NULL,'test1','1','text','')";
$sql2 = "INSERT INTO `news`(`id`,`title`,`slug`,`text`,`imgUrl`) values(NULL,'test12','2','text2','')";
$res = mysql_query($sql);
$res2 = mysql_query($sql2);
if ($res && $res2) {
     mysql_query("COMMIT");
     echo "OK";
} else {
     mysql_query("ROLLBACK");
     echo "NOT OK";
}
mysql_query("END");
mysql_query("SET AUTOCOMMIT=1");






(全文完)

标签: php事务处理

你可以发表评论、引用到你的网站或博客,或通过RSS 2.0订阅这个博客的所有文章。
上一篇: 简洁实用的分页类  |  下一篇:南山南