sql - 自动递增订单号(一张表多个公司)

标签 sql sql-server auto-increment

我有一个自动递增的主键 OrderHeaderID,但我还需要根据订单下达的公司自动递增 OrderNumber。

当前策略:(在表中插入语句)

(SELECT MAX(OrderNumber) + 1 FROM  OrderHeader WHERE CompanyID = @CompanyID)

问题:一旦我开始用一定的音量进行测试,我就开始出现重复的键错误:

表订单标题:

OrderHeaderID CompanyID OrderNumber
1             1         10000
2             1         10001
3             1         10002

4             2         10000
5             2         10001
6             2         10002

最佳答案

要解决并发问题,您必须提高 SELECT 语句的隔离级别,然后在同一事务内执行 INSERT

每个 RBDMS 的具体语法会有所不同,但这里有一个使用 Sql Server 的示例:

BEGIN TRANSACTION
    DECLARE @OrderNumber INT

    SELECT @OrderNumber = MAX(OrderNumber) + 1 
    FROM OrderHeader WITH (XLOCK)
    WHERE CompanyID = @CompanyID

    INSERT... (@OrderNumber)
COMMIT

这会在 SELECT 语句期间读取的行上放置一个独占锁,这将阻止该例程的另一个实例同时运行。相反,第二个实例将被阻塞,直到原始进程执行 INSERT 和 COMMIT,此时第二个实例将继续读取并锁定新生成的值。

关于sql - 自动递增订单号(一张表多个公司),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12414352/

相关文章:

mysql - 过滤 SQL 结果?

sql - SQlite中带有EXISTS查询的CASE返回错误结果

mysql - 将 3 个 SQL 查询混合在 1 个中

javascript - 在 d3.js 图表中回显 JSON

mysql - *你*如何使用auto_increment_increment?

sql - 使用GROUP BY的SQLite更新

sql-server - 如果 SQL Server 中的事务失败,触发器是否会回滚?

sql-server - 无法从Linux管理基于docker的mysql服务器

c# - 如何在 C# 中自动递增数字?

php - 如何在mysql中有一个序列的唯一id