Multithreading 同步客户端呼叫到azure移动服务
我有一个关于同时调用azure移动服务功能的客户端的基本问题。 如何防止多个客户端/用户同时读取和更新变量和db表 我想用AZURE移动服务建立一个排行榜,对于客户端/游戏代码,我使用的是Marmalade SDK。 我为服务创建了一个名为“highscore”的db表,其中“track_id”是主键。 当我开始测试时,db表是空的 在客户端: 我从客户端向我的AZURE移动服务发出“HTTP post”呼叫 该调用包含“TrackId”和“Score”的数据。 我通过一个接一个地打几个电话来模拟多个客户机 伪代码: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”的数据。 我通过一个接一个地打几个电话来模
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客户端。我认为我不理解乐观并发的答案,也不知道如何在这里使用它。我更新了一些问题,我