2011-03-02 42 views
1

example Todos app的Backbone.js的锁定了后台,这发生:多的destroy()S IN Backbone.js的

clearCompleted: function() { 
    _.each(Todos.done(), function(todo){ todo.clear(); }); 
    return false; 
}, 

这通过发送多个HTTP DELETE请求到任何服务删除多个模型是后盾应用程序。在这个例子的情况下,这是没有问题的B/C他们正在使用本地存储解决方案。

但是当我尝试一个类似的后端数据库(sqlite/datamapper/sinatra)进程时,它发送多个删除http请求的事实同时导致数据库锁定并发回一个错误。

这是你们中的任何一个遇到过的吗?

我能想到的两种方法周围:

  1. 有一个destroyBatch()发送ID的数组到DELETE调用,并有西纳特拉嗅出多个ID和处理删除全部一旦服务器端。

  2. 在客户端有一个destroyAsync(),它将ID推入队列,并在异步链式响应中逐个调用模型中的destroy(),直到它们全部消失(但您会看到它们在屏幕上逐一删除,每个之间都有一个暂停)。

这些解决方案中的任何一个看起来是否合理,还是我是一只虚弱的鹅,狂放地挥舞着呢?

-j

+0

+1对于问题和图像:-) – 2011-03-02 22:53:07

+0

谢谢肖恩!现在,如果我可以让某人回答我的问题,我将成为一名快乐的露营者。 – James 2011-03-03 03:56:13

回答

1

选项2不是一个可行的选项。您的用户可以点击或关闭该窗口,删除将不会完全成功。所以这一点。

这使得我们:

  • 修正你的数据库锁最初的问题:d
  • 发送一次要删除所有的ID。

我会尝试首先解决最初的问题。是什么导致他们锁定?我非常肯定,在开发模式下,sinatra会一次处理一个请求,所以发送一堆删除实际上会在后端处理中被序列化......这是另一个与sqlite错误返回有关的问题。

至于批量发送删除。这是一个好主意,但它偏离了标准的RESTful控制器。所以你将不得不自己处理,因为骨干不提供这样做的方法。您可以在集合上添加一个deleteAll方法,并从那里处理同步(如果您依赖它们,请不要忘记发送事件)。

+0

yup ..选项2由于几个原因而不好。臭。同意。 – James 2011-03-04 15:41:59

+1

至于选项1:是否真的违背了REST的理念来影响多个资源?如果我想一次删除1000个物品,我真的想要打1000个电话?这是完成的方式? 根据您的建议。我已经考虑修复我最初的概率,数据库锁定和一些有趣的事情。我在开发中使用sqlite获取数据库锁定,但是当我部署到heroku时,他们的postgres数据库根本不存在多次删除的情况。这显然纯粹是一个数据库问题,所以会去打猎。 感谢您向正确的方向推动我。 – James 2011-03-04 15:50:11