Multithreading 同步客户端呼叫到azure移动服务

Multithreading 同步客户端呼叫到azure移动服务,multithreading,azure,azure-mobile-services,simultaneous,Multithreading,Azure,Azure Mobile Services,Simultaneous,我有一个关于同时调用azure移动服务功能的客户端的基本问题。 如何防止多个客户端/用户同时读取和更新变量和db表 我想用AZURE移动服务建立一个排行榜,对于客户端/游戏代码,我使用的是Marmalade SDK。 我为服务创建了一个名为“highscore”的db表,其中“track_id”是主键。 当我开始测试时,db表是空的 在客户端: 我从客户端向我的AZURE移动服务发出“HTTP post”呼叫 该调用包含“TrackId”和“Score”的数据。 我通过一个接一个地打几个电话来模

我有一个关于同时调用azure移动服务功能的客户端的基本问题。 如何防止多个客户端/用户同时读取和更新变量和db表

我想用AZURE移动服务建立一个排行榜,对于客户端/游戏代码,我使用的是Marmalade SDK。 我为服务创建了一个名为“highscore”的db表,其中“track_id”是主键。 当我开始测试时,db表是空的

在客户端: 我从客户端向我的AZURE移动服务发出“HTTP post”呼叫 该调用包含“TrackId”和“Score”的数据。 我通过一个接一个地打几个电话来模拟多个客户机

伪代码:

  • Http1.Post(trackId=1,trackscore=100)->“
  • Http2.Post(trackId=1,trackscore=200)->“
  • Http3.Post(trackId=1,trackscore=300)->“
  • Http3.Post(trackId=1,trackscore=400)->“
  • 在AZURE移动服务代码中:
    exports.post=函数(请求、响应){
    var mssql=request.service.mssql;
    var trackId=request.param('trackId');
    var trackscore=request.param('trackscore');
    var sql1=“从highscore中选择*,其中track_id=”“+trackId+”;
    查询(sql1{
    成功:功能(结果){
    console.log(“Length1:+results.length+”,score:+trackscore);
    如果(results.length==0){
    log(“创建新分数“+”,分数:“+trackscore”);
    var sql2=“插入highscore(track_id,track_score)值(“+trackId+”,“+trackScore+”)”;
    查询(sql2);
    }else if(results.length==1){
    日志(“更新分数“+”,分数:“+trackscore”);
    var sql2=“UPDATE highscore SET track_score=”“+trackScore+”,其中track_id=”“+trackId+”;
    查询(sql2);
    }否则{
    console.log('错误。trackId的数量:%s=%d',trackId,results.length);
    }
    查询(sql1{
    成功:功能(结果){
    console.log(“Length2:+results.length+”,score:+trackscore);
    }
    });
    },
    错误:函数(err){
    日志(“错误:+err”);
    响应。发送(statusCodes.OK{
    信息:呃
    });
    }
    });
    };
    
    AZURE日志: 服务的“日志”显示所有客户端调用同时都在服务器函数内。当一些客户端线程试图插入一个已经存在的项时,这将导致下面的“错误消息”

    1。信息长度2:1,分数:400 api/test.js 2015年1月29日星期四,‎21‎:‎37‎:‎03
    2.错误{错误消息}api/test.js 2015年1月29日星期四,‎21‎:‎37‎:‎03
    3.信息长度2:1,分数:400 api/test.js 2015年1月29日星期四,‎21‎:‎37‎:‎03
    4.信息长度2:1,分数:200 api/test.js 2015年1月29日星期四,‎21‎:‎37‎:‎03
    5.信息长度2:1,分数:300 api/test.js 2015年1月29日星期四,‎21‎:‎37‎:‎03
    6.错误{错误消息}api/test.js 2015年1月29日星期四,‎21‎:‎37‎:‎03
    7.信息更新分数,分数:200 api/test.js 2015年1月29日星期四,‎21‎:‎37‎:‎03
    8.信息长度1:1,分数:200 api/test.js 2015年1月29日星期四,‎21‎:‎37‎:‎03
    9信息创建新分数,分数:100 api/test.js 2015年1月29日星期四,‎21‎:‎37‎:‎03
    10信息长度1:0,分数:100 api/test.js 2015年1月29日星期四,‎21‎:‎37‎:‎03
    11信息创建新分数,分数:400 api/test.js 2015年1月29日星期四,‎21‎:‎37‎:‎03
    12信息长度1:0,得分400 api/test.js至2015年1月29日,‎21‎:‎37‎:‎03
    13信息创建新分数,分数:300 api/test.js 2015年1月29日星期四,‎21‎:‎37‎:‎02
    14信息长度1:0,分数:300 api/test.js 2015年1月29日星期四,‎21‎:‎37‎:‎02
    
    {ERROR MESSAGE}=“执行查询时出错:错误:[Microsoft][SQL Server本机客户端10.0]
    [SQL Server]违反主键约束“PrimaryKey_3e234221-4811-48a7-bc09-2DAC9A66D37”。
    无法在对象“G.Highscore”中插入重复键。重复键值为(1)。”
    
    问题


    问题是不同的调用同时在服务器代码中,使得sql查询、更新和读取变量的顺序不可预测。应如何处理这一问题?

    Azure mobile services实现乐观并发,它不使用“锁”来防止并发问题,而是让客户端向服务发送更新,但如果另一个客户端以前更新过同一项,则最后一次更新将失败(有相应的响应表明这一点). 如果客户机收到这种“冲突”响应,那么它可以尝试处理冲突(例如,让服务器赢,用新版本重新发送更新,表明它想要覆盖以前的更新,让用户选择,等等)


    讨论服务如何实现乐观并发。显示如何使用托管客户端SDK来使用该功能(在编写时,还没有对其他客户端平台的支持,但它们已经更新)。

    您好,谢谢您的回答。我不知道这是否或如何能帮助我。例如,我没有使用任何托管SDK客户端。我认为我不理解乐观并发的答案,也不知道如何在这里使用它。我更新了一些问题,我