1

我们使用 Sybase ASE (15.5) 服务器作为我们的数据库,并且遇到了奇怪的、间歇性的 SPID 阻塞问题,我试图在应用层以编程方式检测和缓解这些问题。

Sybase 允许您安排所谓的“重组”,据我所知,这是定期重新索引/表压缩、清理等。基本上是预定的数据库维护。

每隔一段时间,我们就会让所有行星相互对齐,其中:

  1. 执行查询(在 Sybase 中创建 SPID)并由于某种原因挂起。这会在表上放置一个(阻塞)共享锁widgets;然后
  2. 计划的重组开始,并想要清理widgets表。reorg 请求排他锁widgets,但无法获取锁,因为widgets已被挂起的 SPID/query 锁定和阻塞;然后
  3. 执行后续查询,每个查询都请求共享锁widgets;这样
  4. 整个系统现在被捆绑了:reorg 在获得独占锁之前无法启动widgets,但widgets被挂起的 SPID 捆绑在阻塞共享锁中。并且由于重组已在 上放置了排他锁widgets,所有其他想要共享锁的查询widgets都必须等到重组完成(因为新请求的排他锁胜过新请求的共享锁)。

我认为我在这里的理想策略是:

  • 说,2 分钟后超时数据库查询,这将防止 SPID 挂起,从而防止重组运行;接着
  • 如果查询尝试访问具有排他锁的表,请检测并特别处理它(例如安排查询在 1 小时后再次运行,希望重组完成时等)

我的问题:

  1. 如何让查询超时以在 2 分钟后释放共享锁?
  2. 有没有办法以编程方式(很可能通过 Sybase JDBC 驱动程序,但也可能通过 Sybase 命令行、HTTP 调用等)确定重组是否正在运行?或者,表上存在排他锁?这样我就可以检测到独占锁并以特殊的方式处理它。

提前致谢!

4

1 回答 1

0

您可以使用以下查询获取在数据库中运行的命令:

select cmd from sysprocesses

要查找锁定信息,您可以加入master..syslocksyour_db..sysobjects找出您尝试访问的对象上存在哪些锁。 syslocks.type表示已到位的锁类型,可以在此处找到这些可能的值:

select object_name(id), db_name(dbid), type from master..syslocks
where dbid = db_id("your_db")

http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc36274.1550/html/tables/X16427.htm

希望这会有所帮助。

要查找锁是否与重组相关联,我认为您应该能够将 syslocks.spid 加入 sysprocesses.spid 其中 cmd = "REORG" 或类似的东西:

select p.cmd, p.spid, l.type from master..sysprocesses p, master..syslocks l  where CMD = "REORG"
于 2013-09-18T22:47:33.760 回答