0

我有一个带有 MySQL 数据库的 Django 应用程序,它允许在 HTML 页面上回答问题。答案通过 AJAX 调用发送到服务器。这些调用由各种 JavaScript 事件发起,并且通常可以为一个答案多次触发。发生这种情况时,一个答案的多个保存请求会发送到服务器。

为了避免重复的答案,每个答案都有一个在第一次保存时生成的客户端 ID - client_id。在创建新的答案服务器端之前,Django 应用程序首先检查数据库以查看是否存在具有此类答案的答案client_id。如果有,第二个保存请求会更新答案,而不是创建一个新答案。

在 Chrome 中,当一个文本输入字段被聚焦,并且用户在 Chrome 窗口之外点击时,两个保存请求一个接一个地被触发。服务器同时接收它们。假设为了这个例子,client_id是 71。

第一个请求检查数据库,发现不存在带有client_id71 的答案。它创建一个新答案并保存在数据库中。我正在使用断点进行调试,此时,我在外部 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。

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

4

1 回答 1

0

我已经解决了这个问题,方法是将我的视图包装在@transaction.autocommit装饰器中并transaction.commit()在检查数据库之前立即执行,如果存在特定的答案client_id。这实现了我想要的“刷新”。

于 2013-06-16T10:54:52.030 回答