【发布时间】:2013-06-16 10:30:06
【问题描述】:
我有一个带有 MySQL 数据库的 Django 应用程序,它允许回答 HTML 页面上的问题。答案通过 AJAX 调用发送到服务器。这些调用由各种 JavaScript 事件发起,并且通常可以为一个答案多次触发。发生这种情况时,一个答案的多个保存请求会发送到服务器。
为了避免重复答案,每个答案都有一个在第一次保存时生成的客户端 ID - client_id。在创建新的答案服务器端之前,Django 应用程序首先检查数据库以查看是否存在带有 client_id 这样的答案。如果有,第二个保存请求会更新答案,而不是创建一个新的。
在 Chrome 中,当文本输入字段获得焦点,并且用户在 Chrome 窗口外单击时,会依次触发两个保存请求。服务器同时接收它们。假设为了这个例子,client_id 是 71。
第一个请求检查数据库,发现不存在带有 client_id 71 的答案。它创建一个新答案并保存在数据库中。我正在使用断点进行调试,此时,我在外部 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。
如何指示数据库连接到“刷新”或“重置”本身以考虑数据库中实际存在的数据?
【问题讨论】:
标签: python mysql database django