热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysql用事务删除sql执行_mysql事务处理,执行sql1成功,执行sql2失败,但是没有rollbacksql1...

测试了一下,表类型是innoDB,这条记录的quantity为unsign类型的初始值是1。因此,$sql数组中的第一条执行成功ÿ

测试了一下,表类型是 innoDB,这条记录的 quantity为 unsign 类型 的初始值是1。因此,$sql 数组中的第一条执行成功,当第二条执行时,执行失败,两条 sql 应该都退回才对。

$db = new mysqli('localhost', 'root', '', 'test');

$sql = array(

'UPDATE `crm_stock_goods` SET quantity=quantity-1 WHERE rec_id=2470',

'UPDATE `crm_stock_goods` SET quantity=quantity-1 WHERE rec_id=2470',

);

echo '开始
';

$db->query('START TRANSACTION');

foreach ($sql as $val) {

echo $val,'
';

if (!$db->query($val)) {

$db->query('ROLLBACK');

echo '退回
';

}

}

$db->query('COMMIT');

echo '结束';

执行结果在显示上,也确实 echo 出了‘退回’,但是数据库中 quantity 却被减掉了1,变成了 0

3cafd2ae05cafec067946a620f9ea23b.png

请问是我代码哪里写错了吗?

说一下我的理解吧。

我修改了题主的代码,让在这个代码中SQL的执行更加清晰了一些,大概是这个样子:

error_reporting(E_ERROR);

$db = new mysqli('127.0.0.1', 'root', '', 'test');

$sql = array(

'UPDATE `crm_stock_goods` SET quantity=quantity-1 WHERE rec_id=2470',

'ROLLBACK',

'UPDATE `crm_stock_goods` SET quantity=quantity-1 WHERE rec_id=2470',

'ROLLBACK',

'COMMIT'

);

echo '开始
';

$db->query('START TRANSACTION');

foreach ($sql as $val) {

echo $val, '
';

$db->query($val);

}

$db->query('COMMIT');

echo '结束';

可以看到,在第一次SQL执行错误之后,事务就已经回滚了。这时候,事务已经结束了,所以后面执行的SQL不会回滚。

个人的一些理解,欢迎补充。

通过对比:

$db->query('START TRANSACTION');

$db->query('BEGIN');

$db->query('SET AUTOCOMMIT=0');

这三条语句,我发现,当使用前两条中的任一条时,quantity 都会变成0,

当使用 $db->query(‘SET AUTOCOMMIT=0’); 时,quantity 没有变化,1还是1

求指点



推荐阅读
author-avatar
手机用户2502937497
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有