我对SQL Server不太经验,所以也许我缺少一些东西

我的情况如下:

  • Session 1使用AutoCommit OFF运行一个创建表(或其他创建语句),而创建则不算。
  • 会议2运行 sp_table 陈述但只要第1次不犯DDL,就会挂起

发生这种情况的情况是在数据库上工作的开发人员。他们中的一些浏览桌子,其中一些在做DDL。如果一个用户忘记提交DDL所有其他想要列出表的会话。请注意 sp_tables 是由SQL客户端(通过JDBC驱动程序API)发出的,因此不能更改它。

我与之合作的数据库启用了SnapShot_isolation,并将隔离级别设置为读取订单(SET ALLOW_SNAPSHOT_ISOLATION ONSET READ_COMMITTED_SNAPSHOT ON)

我的假设是,这些设置应该使SQL Server在锁定并发会议上的行为更好(例如,任何作者永远不会阻止选择的PostgreSQL和Oracle) - 但显然不是这样。

因此,是否有任何方法可以使SQL Server对DDL的并发读/写入情况更加友好? (除了仅在自动命令模式下提交DDL之外)。

有帮助吗?

解决方案

没有,没有办法配置SQL Server来完成您想做的事情。

在快照隔离下 sp_tables 被阻止等待系统基础表之一上的共享键锁(sysschobjs)做一个 SELECTsys.all_objects

使用基于行版本控制的隔离级别 BOL中的主题确实说:

SQL Server不保留多个版本的系统元数据。数据定义语言(DDL)语句在表和其他数据库对象(索引,视图,数据类型,存储过程和通用语言运行时函数)上更改元数据。

甚至在下面 TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 打电话 sp_tables 然而,最终被封锁,而直截了当 SELECT ... FROM sys.all_objects 不再阻止相同的查询参考 HAS_PERMS_BY_NAME 功能在 WHERE 条款。这似乎启动了系统事务(CMetadataAccessor::CMetadataAcce)在较高的隔离级别,最终被阻止等待共享键锁 sysschobjs 再次。

其他提示

一个想法:安排每15秒的工作,以寻找空闲的ddls并终止会话并将其恢复。

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top