0

从天蓝色弹性池中的分片映射中删除分片时遇到问题

var isMapKeyExists = shardMap.TryGetMappingForKey(tenantId, out PointMapping<int> pointMapping);
            if(pointMapping.Status == MappingStatus.Online)
            {
                pointMapping = shardMap.MarkMappingOffline(pointMapping);
            }

            if (isMapKeyExists)
            {
                shardMap.DeleteMapping(pointMapping);

                Thread.Sleep(TimeSpan.FromSeconds(30));

                if (enableDedicatedDb)
                {
                    shardMap.DeleteShard(shard);
                }
            }

所以首先我只是从 shardMap 中删除了映射,但是一旦我从 shardMap 中删除了 deleteShard,我就会得到以下信息:

属于分片映射“UserIdShardMap”的分片“[DataSource=*** Database=Test21]”已在存储中更新。为操作“DeleteShard”执行存储过程“__ShardManagement.spBulkOperationShardsGlobalBegin”时出错。如果另一个并发用户更新分片,则可能会发生这种情况。对分片位置执行 GetShard 操作以获取更新的实例。有人可以帮我吗?

4

1 回答 1

0

这可能不再相关,但仅供参考:异常指向目录中的一种并发冲突。要绕过它,你必须改变

shardMap.DeleteShard(shard);

类似于:

var shard = _shardMap.GetShard(pointMapping.Shard.Location);
_shardMap.DeleteShard(shard);

您可以忘记 Thread.Sleep,这是立即生效的。

于 2018-11-05T16:56:33.903 回答