You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firestore实现订单号连续自增:Flutter多用户并发场景解决方案

解决Firestore并发场景下订单号严格递增的问题

核心方案是利用Firestore的**事务(Transaction)**实现原子性的读-改-写操作,确保并发请求下每个订单都能拿到唯一且严格递增的编号,完全避免重复。

具体实现步骤

  • 维护一个专门的计数器文档:比如在system集合下创建counters文档,用数值类型字段orderNumber存储当前最大的订单号(比如初始值为0,第一个订单会生成1)。
  • 通过事务原子更新计数器:事务会确保同一时间只有一个请求能成功读取并更新计数器,冲突的请求会自动重试,直到拿到新的编号。

Flutter代码示例

import 'package:cloud_firestore/cloud_firestore.dart';

// 生成唯一递增的订单号(格式化为4位带前导零)
Future<String> generateNextOrderNumber() async {
  final firestore = FirebaseFirestore.instance;
  final counterDoc = firestore.collection('system').doc('counters');

  return firestore.runTransaction((transaction) async {
    // 读取计数器文档
    final snap = await transaction.get(counterDoc);
    
    int nextNumber;
    if (!snap.exists) {
      // 首次使用,初始化计数器为1
      nextNumber = 1;
      transaction.set(counterDoc, {'orderNumber': nextNumber});
    } else {
      // 递增当前编号
      int current = snap.data()!['orderNumber'] as int;
      nextNumber = current + 1;
      transaction.update(counterDoc, {'orderNumber': nextNumber});
    }

    // 格式化为4位字符串(可根据需求调整位数)
    return nextNumber.toString().padLeft(4, '0');
  });
}

// 创建订单时调用
Future<void> createNewOrder(Map<String, dynamic> orderData) async {
  try {
    final orderNumber = await generateNextOrderNumber();
    // 将订单号加入订单数据,并存入Firestore
    await FirebaseFirestore.instance
        .collection('orders')
        .doc(orderNumber) // 也可以用自动ID,把orderNumber作为字段
        .set({
          ...orderData,
          'orderNumber': orderNumber,
          'createdAt': FieldValue.serverTimestamp(),
        });
  } catch (e) {
    // 处理异常,比如提示用户重试
    print('创建订单失败:$e');
  }
}

关键说明

  • 原子性保证:事务会把"读取计数器→递增→写入新值"这一系列操作绑定成原子操作,并发时只有一个请求能完成,其他请求会自动重试,不会出现两个请求拿到相同编号的情况。
  • 数值存储优势:用数值类型存储计数器比直接存字符串更方便递增,避免字符串处理的边界问题(比如"0099"递增到"0100"的转换),最后再格式化为需要的字符串格式即可。
  • 重试机制:Firestore内置了事务冲突重试逻辑,不需要自己编写重试代码,确保最终每个请求都能成功获取唯一编号。

内容的提问来源于stack exchange,提问作者cueless

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 15:50:16