mysql 事务处理,执行sql-1成功,执行 sql-2失败,但是没有 rollback sql-1

发布于 2022-09-04 02:22:10 字数 822 浏览 32 评论 0

测试了一下,表类型是 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 '开始<br>';
$db->query('START TRANSACTION');
foreach ($sql as $val) {
    echo $val,'<br>';
    if (!$db->query($val)) {
        $db->query('ROLLBACK');
        echo '退回<br>';
    }
}
$db->query('COMMIT');
echo '结束';

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

南烟 2022-09-11 02:22:10

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

<?php

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 '开始<br>';
$db->query('START TRANSACTION');
foreach ($sql as $val) {
    echo $val, '<br>';
    $db->query($val);
}
$db->query('COMMIT');
echo '结束';

可以看到,在第一次SQL执行错误之后,事务就已经回滚了。这时候,事务已经结束了,所以后面执行的SQL不会回滚。
个人的一些理解,欢迎补充。

梦冥 2022-09-11 02:22:10

通过对比:

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

这三条语句,我发现,当使用前两条中的任一条时,quantity 都会变成0,
当使用 $db->query('SET AUTOCOMMIT=0'); 时,quantity 没有变化,1还是1

求指点

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文