我们使用 Sybase ASE (15.5) 服务器作为我们的数据库,并且遇到了奇怪的、间歇性的 SPID 阻塞问题,我试图在应用层以编程方式检测和缓解这些问题。
Sybase 允许您安排所谓的“重组”,据我所知,这是定期重新索引/表压缩、清理等。基本上是预定的数据库维护。
每隔一段时间,我们就会让所有行星相互对齐,其中:
- 执行查询(在 Sybase 中创建 SPID)并由于某种原因挂起。这会在表上放置一个(阻塞)共享锁
widgets
;然后 - 计划的重组开始,并想要清理
widgets
表。reorg 请求排他锁widgets
,但无法获取锁,因为widgets
已被挂起的 SPID/query 锁定和阻塞;然后 - 执行后续查询,每个查询都请求共享锁
widgets
;这样 - 整个系统现在被捆绑了:reorg 在获得独占锁之前无法启动
widgets
,但widgets
被挂起的 SPID 捆绑在阻塞共享锁中。并且由于重组已在 上放置了排他锁widgets
,所有其他想要共享锁的查询widgets
都必须等到重组完成(因为新请求的排他锁胜过新请求的共享锁)。
我认为我在这里的理想策略是:
- 说,2 分钟后超时数据库查询,这将防止 SPID 挂起,从而防止重组运行;接着
- 如果查询尝试访问具有排他锁的表,请检测并特别处理它(例如安排查询在 1 小时后再次运行,希望重组完成时等)
我的问题:
- 如何让查询超时以在 2 分钟后释放共享锁?
- 有没有办法以编程方式(很可能通过 Sybase JDBC 驱动程序,但也可能通过 Sybase 命令行、HTTP 调用等)确定重组是否正在运行?或者,表上存在排他锁?这样我就可以检测到独占锁并以特殊的方式处理它。
提前致谢!