我尝试了不同的方法并用谷歌搜索了很多错误,但到目前为止还没有运气。
我正在尝试创建一个可以更新现有分片映射的函数,但出现以下异常。
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);
我在谷歌上搜索了很多并下载了一些示例应用程序,但我找不到解决方案。我将非常感谢任何形式的帮助。