我有一个带有MySQL数据库的Django应用程序,可以回答HTML页面上的问题。答案通过AJAX调用发送到服务器。这些调用由各种JavaScript事件启动,并且通常可以针对一个答案多次触发。发生这种情况时,会将一个答案的多个保存请求发送到服务器。
为了避免重复的答案,每个答案都有第一次保存时生成的客户端ID - client_id
。在创建新的答案服务器端之前,Django应用程序首先检查数据库以查看是否存在具有此类client_id
的答案。如果有,则第二个保存请求更新答案而不是创建新答案。
在Chrome中,当文本输入字段被聚焦,并且用户在Chrome窗口外部点击时,两个保存请求将一个接一个地被触发。服务器接收它们。让我们说,为了示例,client_id
是71。
第一个请求检查数据库,发现没有client_id
71的答案。它会创建一个新的答案并保存在DB中。我正在使用断点进行调试,此时,我在外部MySQL数据库查看器中看到答案确实已保存。在我的IDE中,当我执行Answer.objects.filter(client_id=71)
时,我也得到了答案。我让调试器继续。
我的第二个断点立即触发第二个AJAX保存应答请求。现在发生了一件奇怪的事情。在我的IDE中,当我执行Answer.objects.filter(client_id=71)
时,我看不到任何答案!我的外部工具确认答案就在那里。所以我的代码创建了一个新答案并保存。现在,如果在我的IDE中执行Answer.objects.filter(client_id=71)
,我会看到client_id
的两个答案。
我猜测数据库连接或MySQL使用某种基于时间的方法来保持视图不变,但它在这里引起了我的问题。我希望能够直观地了解数据库的状态。
我没有使用任何事务管理,所以Django应该做auto_commit。
如何指示数据库连接到"刷新"或"重置"本身要考虑数据库中实际存在的数据?
答案 0 :(得分:0)
我已经通过将我的视图包装在@transaction.autocommit
装饰器中并在签入数据库之前立即执行transaction.commit()
来解决此问题,如果存在特定client_id
的答案。这实现了我的目标“刷新”。