php mysqli扩展中两种开启事物的区别
高洛峰
高洛峰 2017-04-11 10:29:37
[PHP讨论组]

我看文档中有两种实现事物的方法,一种是:

$link->autocommit( FALSE );//关闭自动提交

$link->query( 'sql...' );
$link->query( 'sql...' );
...
$link->commit()

一种是:

$link->begin_transaction();//显示声明开始事物
$link->query( 'sql...' );
$link->query( 'sql...' );
...
$link->commit();

这两种实现的方法有什么异同吗?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(2)
怪我咯

事务举例:用户1支付50元购买了商品2

<?php
$db = new mysqli('127.0.0.1','user','pass','dbname',3306);
$db->query('SET AUTOCOMMIT=0');  //可以写成 $db->autocommit(false);
$db->query('START TRANSACTION'); //可以写成 $db->begin_transaction();
$db->query('UPDATE user SET coin=coin-50 WHERE id=1 AND coin>=50');
$ar1 = $db->affected_rows;
$db->query('UPDATE goods SET num=num-1 WHERE id=2 AND num>1');
$ar2 = $db->affected_rows;
//两条UPDATE语句都操作成功时(受影响的行都为1)提交事务,否则回滚
if($ar1 === 1 && $ar2 === 1) {
    $db->query('COMMIT');       //可以写成 $db->commit();
} else {
    $db->query('ROLLBACK');     //可以写成 $db->rollback();
}
$db->query('SET AUTOCOMMIT=1'); //可以写成 $db->autocommit(true);

注意,MySQL InnoDB引擎会把单条写操作(insert/update/delete,create/alter/drop等)当做事务来处理并自动提交.所以上面需要先关闭自动提交,这样才可以手动提交多条语句.需要注意的是,手动提交事务后记得设置回自动提交,否则后面的写操作因为没有手动提交会导致自动回滚.

PHP中文网

达到的效果是一样的,都是开启了事务。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号