我的应用程序允许用户上传和转录音频文件。我的代码将音频文件和转录存储在 postgres 数据库中。
这是我的原始代码:
try:
transcribed_doc = TranscribedDocument.objects.get(id=session_id)
except TranscribedDocument.DoesNotExist:
...
try:
if transcribed_doc.state == 'not_started':
transcribed_doc.state = 'in_progress'
transcribed_doc.save()
...
调整后的代码如下:
try:
transcribed_doc = TranscribedDocument.objects.select_for_update().get(id=session_id)
except TranscribedDocument.DoesNotExist:
...
try:
if transcribed_doc.state == 'not_started':
transcribed_doc.state = 'in_progress'
transcribed_doc.save()
...
我知道select_for_update()
用于锁定正在更新的行,以防止多个调用可能同时尝试更新同一条记录的情况。
但我只能想象这种情况,如果同一个用户错误地或恶意地多次启动相同的转录过程,例如多次点击开始转录按钮。
如果您认为可能会有并发请求更新数据,最好始终锁定行。尽管您目前可能没有很多同时更新行的示例,但随着应用程序的增长,可能会出现更多情况。例如,您可能会添加一个后台进程来检查某些内容并更新模型上的字段。
但是,如果您不预见到这种情况发生,您可以暂时不使用锁,并在以后需要时添加它们。最终,这一切都取决于使用您的应用程序的请求/用户的数量。
另请阅读有关
deadlocks
它们发生的原因。