有时无法通过Django删除Oracle数据库行

1 投票
1 回答
1280 浏览
提问于 2025-04-11 18:32

我有一个单元测试,其中包含以下代码行

Site.objects.get(name="UnitTest").delete()

这段代码之前一直运行得很好。但是现在,这个语句卡住了。它会一直在那里尝试执行删除操作,似乎永远也不会完成。如果我只执行

print Site.objects.get(name="UnitTest")

那么它就能正常工作,所以我知道它可以成功获取网站。没有其他程序连接到Oracle数据库,所以并不是说有两个开发者在互相干扰。我猜可能是某种表锁没有被释放。

所以除了关闭Oracle数据库再重新启动之外,我该如何释放这个锁或者解决阻碍我的问题呢?我希望不必关闭数据库,因为这样可能会影响到其他开发者的工作。

编辑:Justin建议我查看一下DBA_BLOCKERSDBA_WAITERS这两个表。不幸的是,我对这两个表完全不懂,也不知道该找什么。所以我把我认为相关的信息分享一下:

DBA_WAITERS表有182条记录,锁类型是"DML"。DBA_BLOCKERS表有14条记录,它们的会话ID都对应我们应用程序代码使用的用户名。

因为这个问题需要解决,我打算重启一下网络服务器,但如果这个问题再次出现,我还是希望能得到一些建议。我对Oracle管理非常陌生,以前主要使用的是MySQL,所以我真的有点不知所措。

编辑 #2:结果证明,尽管我以为没有,但另一位程序员确实和我同时在访问数据库。那么将来如何最好地检测到这种情况呢?也许我应该先关闭我的程序,然后查询一下DBA_WAITERSDBA_BLOCKERS表,确保它们是空的。

1 个回答

1

你能不能从另一个会话中查询一下DBA_BLOCKERS和DBA_WAITERS这两个数据字典表,并把结果发出来?这样你就能知道你的会话是否被其他会话持有的锁给阻塞了,还能知道是哪个会话在持有这个锁。

撰写回答