首页 > 解决方案 > 如果事务中发生错误,对表的 id 索引有影响吗?

问题描述

这是我在 Yii 1.1 中的主要交易代码:

try{
     $transaction=Yii::app()->projectdb->beginTransaction();
     foreach($list as $order){
         $orderInfo = OrderInfo::model()->findByPk($order['order_id']); 
         if(empty($orderInfo )){
             throw new Exception('Empty order_info');
          }
       // ...
       // save order data into mysql

         }
      $transaction->commit();

   }catch (Exception $e){
       $transaction->rollBack();
    }

现在,我发现我的表格顺序中有遗漏的 ID,

select id from order where id between 10231 and 10280

# id      name 
# 10231   name_10231
# 10280   name_10280

# missed 50 data

这和上面的交易代码有关吗?当事务中发生错误时,它会添加 id 的索引?

非常感谢,如果你能给我一个明确的答案。。

标签: phpmysqlyii

解决方案


是的,它可能与回滚事务有关。如果您在事务期间插入新记录,MySQL 会为该记录保留 ID(增加AUTO_INCREMENT计数器,因此不同进程可以在此事务期间插入记录而不会出现 ID 冲突的风险)。如果您回滚事务,此 ID 将不会被重用。因此,如果您:

  1. 公开交易,
  2. 插入50条记录,
  3. 回滚事务,

您最终会在 IDs 列中出现空白,因为这 50 个 ID 被保留,但从未提交。


推荐阅读