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

在PHP中,使用MySQLi进行数据库操作时遇到事务处理的问题。当更新记录导致quantity减为0时,预期事务应回滚,但实际并未完全回滚。经过测试发现,使用'SETAUTOCOMMIT=0'时事务处理正常,而'STARTTRANSACTION'或'BEGIN'会导致quantity减1。这提示可能存在事务处理的误解或代码逻辑错误。
摘要由CSDN通过智能技术生成

测试了一下,表类型是 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

3cafd2ae05cafec067946a620f9ea23b.png

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

说一下我的理解吧。

我修改了题主的代码,让在这个代码中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不会回滚。

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

通过对比:

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

$db->query('BEGIN');

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

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

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

求指点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值