我的应用程序中存在锁定挑战。在invoice
获得批准后会自动创建timesheet
。发票需要由员工手动调整(添加增值税代码,联系人数据等),然后单击adapt
按钮。在那一刻,timesheet
获得状态locked
,因此不再对时间表进行任何更改。
一切正常,除了一个边缘案例:员工点击adapt
按钮,但后来对发票没有任何作用。例如。它转到另一个屏幕,忘记了发票等。在这种情况下,时间表永远处于locked
状态,而它应该被解锁。
我该怎么做才能解决这个问题?我目前的想法是创建一个rake任务,以一定的时间间隔检查locked
状态的时间表,并在当前时间和时间表{{1}之间超过一小时时删除locked
状态时间。
但也许有另一种策略可以更好地处理这种情况?
答案 0 :(得分:1)
你可以使用gmail的方法例如(当你在完成电子邮件之前离开页面时,他会询问你是否确定要离开这个页面,如果是的话他会丢弃这个消息) 在你的情况下,你应该做同样的事情并发送一个ajax请求来解锁记录 在所有情况下,您都需要执行rake任务,以便在电源关闭或浏览器崩溃时处理关闭的情况。但它会提供更好的方便,以避免锁定一个小时的记录,除非在非常特殊的情况下,例如这些
答案 1 :(得分:0)
您当前使用的策略是悲观的,我建议使用乐观策略:
http://api.rubyonrails.org/classes/ActiveRecord/Locking/Optimistic.html
结果是,如果有人打开页面,去吃午餐,同时另一个用户更新记录,然后当用户从午餐回来并提交表单时,将发生异常。
接下来的问题是你如何处理异常?告诉用户这已经处理好了吗?向用户显示冲突以便他们解决冲突?