测试了一下,表类型是 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
请问是我代码哪里写错了吗?
说一下我的理解吧。
我修改了题主的代码,让在这个代码中SQL的执行更加清晰了一些,大概是这个样子:
可以看到,在第一次SQL执行错误之后,事务就已经回滚了。这时候,事务已经结束了,所以后面执行的SQL不会回滚。
个人的一些理解,欢迎补充。