首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sybase/JDBC:如何检测reorgs或独占锁?

Sybase/JDBC:如何检测reorgs或独占锁?
EN

Stack Overflow用户
提问于 2013-09-18 19:49:58
回答 1查看 1.2K关注 0票数 1

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

Sybase允许您调度所谓的"reorgs“,据我所知,这是周期性的重新索引/表压缩、清理等,基本上是定期的DB维护。

每隔一段时间,我们就会看到所有的行星互相排列,其中:

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

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

  • 在2分钟后超时DB查询,这将防止SPID挂起,从而阻止reorgs运行;
  • 如果查询试图命中具有独占锁的表,则检测此表并专门对其进行hadle (例如,当reorg完成时,将查询安排在1小时后再次运行,等等)。

我的问题:

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

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-18 22:47:33

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

代码语言:javascript
复制
select cmd from sysprocesses

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

代码语言:javascript
复制
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

希望这能帮上忙。

要查找锁是否绑定到reorg,我认为您应该能够将syslocks.spid连接到sysprocesses.spid,其中cmd = "REORG“或类似的内容:

代码语言:javascript
复制
select p.cmd, p.spid, l.type from master..sysprocesses p, master..syslocks l  where CMD = "REORG"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18881086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档