gpt4 book ai didi

python - Django + MySQL : savepoint does not exist?

转载 作者:行者123 更新时间:2023-11-28 19:50:12 26 4
gpt4 key购买 nike

我在共享主机计划上运行一个小型 Web 应用程序。我有一个包含无限循环的“工作函数”;循环检查数据库中的任务队列以查找新的任务。这需要使用 @transaction.commit_manually 来击败 Django 的缓存并获得每次迭代的最新信息。

我最近实现了数据库日志记录,因此需要在我的工作函数中引入使用保存点 - 这样,如果出现任何问题,我可以回滚到一个好的保存点,登录到数据库,并继续直到我到达最终transaction.commit()

现在,与我的开发服务器不同,生产服务器给我错误:

 DatabaseError: (1305, 'SAVEPOINT s140364713719520_x1 does not exist')

指向 except block 中的 transaction.savepoint_rollback() 调用(请参阅下面的源代码)。开发服务器没有这样的问题;如果我在交互式 shell 中键入 transaction.savepoint(),生产服务器会愉快地生成保存点 ID。

This is the outline of my code ,如果有帮助的话;我尽量保持简洁。

如果那里有任何仁慈的 Python 专家,请帮助我。我对此感到非常沮丧,尽管我认为我在冷静地处理它方面做得相当好。

最佳答案

我有同样的偶尔重复出现的讨厌错误:

OperationalError: (1305, 'SAVEPOINT {{name}} does not exist')

谷歌搜索并没有让它更清楚,除了它是一种“正常”的并发问题。因此它是不确定的,很难在开发环境中重现。

幸运的是,我能够通过使生产应用程序的日志记录足够详细来对其进行本地化。

原因

在 MySQL 中有一些可以隐式结束事务的操作:

  • DDL 语句(例如 CREATE TABLEALTER TABLE 等)导致隐式提交。众所周知,MySQL 中的 DDL 不是事务性的,
  • OperationalError: (1213, '尝试获取锁时发现死锁;尝试重新启动事务')OperationalError: (1205, '超出锁等待超时时间;尝试重新启动事务') 导致隐式回滚。

所以第二种情况确实有点“正常”。它可以用下面的代码表示:

# db is an example database connection object, which 
# - supports nested (stacked) transactions,
# - has autocommit on.

db.begin() # START TRANSACTION
try:
# no-conflict op
db.update()

db.begin() # SAVEPOINT sp1
try:
# conflict op,
# e.g. attempt to change exclusively locked rows by another transaction
db.update()

db.commit() # RELEASE SAVEPOINT sp1
except:
# Everything interesting happens here:
# - the change attempt failed with OperationalError: (1213, 'Deadlock...'),
# - the transaction is rolled back with all the savepoints,
# - next line will attempt to rollback to savepoint which no longer exists,
# - so will raise OperationalError: (1305, 'SAVEPOINT sp1 does not exist'),
# - which will shadow the original exception.

db.rollback() # ROLLBACK TO SAVEPOINT sp1
raise

db.commit() # COMMIT
except:
db.rollback() # ROLLBACK
raise

更新

请注意,上面关于异常阴影的内容是针对 Python 2 说的。Python 3 实现了 exception chaining如果出现死锁,回溯将包含所有相关信息。

关于python - Django + MySQL : savepoint does not exist?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13728843/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com