异步数据库插入操作的顺序ID生成

时间:2016-07-11 08:10:15

标签: c# asynchronous foreach task-parallel-library

这是我面临的一个典型问题。 我想使用异步TPL在数据库中插入2k行,其中每个记录都有一个增量顺序键。

我的服务端有三层:

以下是:

在服务方面:

首先,我从数据库中获取max seq密钥。

Data.Upload.UploadDetails gd = new Data.Upload.UploadDetails();

try
{

    var Max_seq_key = gd.getGroupMembershipSeqKeyDetails();

getGroupMembershipSeqKeyDetails 方法位于 DAL图层中,如下所示:

    public long getGroupMembershipSeqKeyDetails()
    {
        Repository rep = new Repository();
        string strSPQuery = string.Empty;
        List<long> listSeqKey = new List<long>();
        long strMaxSeqKey = -1;

        try
        {
            listSeqKey = rep.ExecuteSqlQuery<Int64>(SQL.Upload.UploadDetails.getMaxSeqKeySQL()).ToList();
            strMaxSeqKey = listSeqKey[0] != null ? listSeqKey[0] : strMaxSeqKey;
            return strMaxSeqKey;
        }
        catch (Exception e)
        {
            return strMaxSeqKey;
        }
    }

因此,在服务层,我从数据库中获取最大seq密钥。

现在我想使用来自服务端的以下声明插入2k记录。

            foreach (var grpMem in input.ListGroupMembershipUploadDetailsInput.GroupMembershipUploadInputList)
            {
                try
                {
                    Task.Run(() => gd.insertGroupMembershipUploadDetails(grpMem,
                                                    input.ListChapterUploadFileDetailsInput, ++Max_seq_key, ++Max_grp_seq_key, Lst_com_unit_key, trans_key));
                }

++ Max_seq_key 并不总能得到保证。

有时我会得到数据库中的结果:

enter image description here

如何确保此增量seq键总是大于前一个插入记录的1,当然在另一个线程上运行?

1 个答案:

答案 0 :(得分:3)

  

如何确保此增量序列密钥始终大于1

明显的答案是&#34;不要在客户端生成密钥&#34;。
忘了max + 1方法。

使用数据库功能生成唯一键,例如identity列或sequences

链接是特定于MS SQL的,但您可以轻松地找到另一个RDBMS的相同文档,例如这是Oracle的一个。

P.S。你的&#34; async&#34;代码不是真正的异步 - 必须以异步方式重写存储库。