0

我尝试了不同的方法并用谷歌搜索了很多错误,但到目前为止还没有运气。

我正在尝试创建一个可以更新现有分片映射的函数,但出现以下异常。

Microsoft.Azure.SqlDatabase.ElasticScale.ShardManagement.ShardManagementException: Store Error: Error 515, Level 16, State 2, Procedure __ShardManagement.spBulkOperationShardMappingsLocal, Line 98, Message: Cannot insert the value NULL into column 'LockOwnerId', table 'TEST-POS.__ShardManagement.ShardMappingsLocal'; column does not allow nulls. INSERT fails.

虽然我创建了 Create Shard 和 Delete Shard 功能,但它们工作正常。但是在更新或创建映射时出现上述错误。

以下是我的代码:

                PointMapping<int> pointMapping;
                bool mappingExists = _listShardMap.TryGetMappingForKey(9, out pointMapping);
                if (mappingExists)
                {
                    var shardLocation = new ShardLocation(NewServerName, NewDatabaseName);
                    Shard _shard;
                    bool shardExists =
                    _listShardMap.TryGetShard(shardLocation, out _shard);

                    if (shardExists)
                    {
                        var token = _listShardMap.GetMappingLockOwner(pointMapping);
                        var mappingUpdate = new PointMappingUpdate { Shard = _shard, Status = MappingStatus.Online };
                        var newMapping = _listShardMap.UpdateMapping(_listShardMap.MarkMappingOffline(pointMapping), mappingUpdate, token);
                    }
                }

无论是否提供令牌,我都会遇到相同的错误。然后我也尝试以这种方式提供令牌 MappingLockToken.Create(),但随后我得到不同的错误,即未提供正确的令牌。这也很明显,因为令牌不同。

    _listShardMap.UpdateMapping(offlineMapping, mappingUpdate, MappingLockToken.Create());

Microsoft.Azure.SqlDatabase.ElasticScale.ShardManagement.ShardManagementException: Mapping referencing shard '[DataSource=cps-pos-test-1.database.windows.net Database=Live_MSA_Test_Cloud]' belonging to shard map 'ClientIDShardMap' is locked and correct lock token is not provided. Error occurred while executing procedure 

我还检查了数据库中 [__ShardManagement].[ShardMappingsGlobal] 表中的 LockOwnerId,这是 ID = 00000000-0000-0000-0000-000000000000

我虽然收到空插入错误,因为令牌 ID 为零,所以我通过执行更新查询将其手动更新为数据库中的 451a4da0-e3d4-42ac-bdc3-5b57022693d0。但它不起作用,我得到相同的无法将值 NULL 插入列“LockOwnerId”错误。

在创建新映射时,我也面临同样的 Null 错误,并且在代码中我没有看到在创建映射时提供令牌的位置。以下是代码。

PointMappingCreationInfo<int> newMappingInfo = new PointMappingCreationInfo<int>(10, newShard, MappingStatus.Online);
                        var newMapping = _listShardMap.CreatePointMapping(newMappingInfo);

我在谷歌上搜索了很多并下载了一些示例应用程序,但我找不到解决方案。我将非常感谢任何形式的帮助。

4

0 回答 0