有时无法通过Django删除Oracle数据库行
我有一个单元测试,其中包含以下代码行
Site.objects.get(name="UnitTest").delete()
这段代码之前一直运行得很好。但是现在,这个语句卡住了。它会一直在那里尝试执行删除操作,似乎永远也不会完成。如果我只执行
print Site.objects.get(name="UnitTest")
那么它就能正常工作,所以我知道它可以成功获取网站。没有其他程序连接到Oracle数据库,所以并不是说有两个开发者在互相干扰。我猜可能是某种表锁没有被释放。
所以除了关闭Oracle数据库再重新启动之外,我该如何释放这个锁或者解决阻碍我的问题呢?我希望不必关闭数据库,因为这样可能会影响到其他开发者的工作。
编辑:Justin建议我查看一下DBA_BLOCKERS
和DBA_WAITERS
这两个表。不幸的是,我对这两个表完全不懂,也不知道该找什么。所以我把我认为相关的信息分享一下:
DBA_WAITERS
表有182条记录,锁类型是"DML"。DBA_BLOCKERS
表有14条记录,它们的会话ID都对应我们应用程序代码使用的用户名。
因为这个问题需要解决,我打算重启一下网络服务器,但如果这个问题再次出现,我还是希望能得到一些建议。我对Oracle管理非常陌生,以前主要使用的是MySQL,所以我真的有点不知所措。
编辑 #2:结果证明,尽管我以为没有,但另一位程序员确实和我同时在访问数据库。那么将来如何最好地检测到这种情况呢?也许我应该先关闭我的程序,然后查询一下DBA_WAITERS
和DBA_BLOCKERS
表,确保它们是空的。
1 个回答
1
你能不能从另一个会话中查询一下DBA_BLOCKERS和DBA_WAITERS这两个数据字典表,并把结果发出来?这样你就能知道你的会话是否被其他会话持有的锁给阻塞了,还能知道是哪个会话在持有这个锁。