锁定多事务异步数据库(Mongo Db)调用

时间:2015-09-16 23:13:50

标签: c# multithreading mongodb asynchronous locking

我有一个mongo(离线)数据库调用,它删除旧记录,然后从SQL(在线)数据库中插入新记录。我想锁定这个方法以防止竞争条件如下:

  1. 线程1删除旧数据
  2. 线程2删除(相同)旧数据(由于线程1已经处理它,它们确实不存在)
  3. 线程1插入新数据
  4. 线程2插入(相同)新数据;独特的钥匙违规行为将在这里发生!!!
  5. 我知道锁定它的方法是使用Task.Wait()或Task.Result将所有异步方法转换为同步方法,然后使用c#lock方法将其锁定(https://msdn.microsoft.com/en-us/library/c5kehkcz.aspx )。但这是一个好习惯吗?

    我试图遵循St​​ephen Cleary关于Asynch编程的最佳实践(https://msdn.microsoft.com/en-us/magazine/JJ991977.aspx),并希望让异步调用冒出来,这样就违背了上面提到的异步方法的建议解决方案同步方法以尝试将其包装在lock语句中。

    以下是代码示例:

        public async static Task SyncUserPermissionsForDocsAsync(List<long> docIdList)
        {
            var permissionListToSync = await OnlineDataAccess.GetPermissionListToSync(docIdList).ConfigureAwait(false);
            await OfflineDataAccess.DropUserPermissionAsync(docIdList).ConfigureAwait(false);
            await OfflineDataAccess.AddUserPermissionsAsync(permissionListToSync).ConfigureAwait(false);
        }
    

0 个答案:

没有答案