php - 如果事务中发生错误,对表的 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 的索引?
非常感谢,如果你能给我一个明确的答案。。
解决方案
是的,它可能与回滚事务有关。如果您在事务期间插入新记录,MySQL 会为该记录保留 ID(增加AUTO_INCREMENT
计数器,因此不同进程可以在此事务期间插入记录而不会出现 ID 冲突的风险)。如果您回滚事务,此 ID 将不会被重用。因此,如果您:
- 公开交易,
- 插入50条记录,
- 回滚事务,
您最终会在 IDs 列中出现空白,因为这 50 个 ID 被保留,但从未提交。
推荐阅读
- graphql - Strapi graphql 插件:如何获取所有记录
- r - R中k模式聚类的迭代次数
- snowflake-cloud-data-platform - 雪花仓库:获取分配给用户的所有角色(包括继承的角色)
- python - 使用 for 循环计算峰度和偏度
- shopify - 无法通过未列出的公共应用程序更改/添加 shopify 付费计划商店的数据
- elixir - 为什么 edeliver 在重新启动时生成不正确的 sys.config
- python - 如何将页面源代码中的 json 解码为字典?
- reactjs - 无法对未安装的组件执行 React 状态更新。React、redux 和 useEffect 的问题
- material-ui - 为什么 TouchRipple.js 在 material-ui/core v4.7.0 git 标记中与 @material-ui/core 4.7.0 npm 包不同?
- android - 在 gradle 中找不到方法:coreLibraryDesugaringEnabled