Django中的同时AJAX请求和MySQL数据库数据可见性

时间:2013-06-16 10:30:06

标签: python mysql database django

我有一个带有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。

如何指示数据库连接到"刷新"或"重置"本身要考虑数据库中实际存在的数据?

1 个答案:

答案 0 :(得分:0)

我已经通过将我的视图包装在@transaction.autocommit装饰器中并在签入数据库之前立即执行transaction.commit()来解决此问题,如果存在特定client_id的答案。这实现了我的目标“刷新”。