我的应用程序有一个Azure移动服务后端。我以一种非常开箱即用的方式使用MSSQL。但是,我有多个客户端可以在理论上同时访问相同的对象。对我来说,充分的解决方案是使用乐观锁定来避免任何进一步的并发问题。
所以我的问题是这个。我有一个由后端填充的时间戳。我的问题是,是否有一种巧妙的方法来处理在过程中获取项目的“旧版本”,或者我是否被迫从数据库中手动查询对象 - 或者是否可以在查询中轻松地合并日期约束类似于
function update(item, user, request) {
query.where...
request.execute();
}
但更新中没有查询?性能对我的应用程序很重要,因为我希望有很多查询。
答案 0 :(得分:0)
乐观锁定对网络来说真的没有意义。您的读取和更新操作是无状态的,并且是独立请求的一部分(刷新HTTP可能是一个好主意)。
这并不是说每个请求都不能使用事务(请参阅mssql
对象http://msdn.microsoft.com/en-us/library/windowsazure/jj554212.aspx)。但是从基础分布式Web应用程序中,跨多个请求引入事务通常是一个糟糕的架构决策。 (见CAP定理)。
您可以使用Azure队列模拟事务或“sagas”以及命令和事件等消息来更改数据库中的新状态以管理用户的锁定记录。或者您可以只使用另一个表来管理现有表的记录锁。无论哪种方式,您都必须在应用程序逻辑中明确记录锁定,因为读取和更新是不同的请求以及无状态Web和分布式计算的固有特性。