SQL Server(2012)非阻滞DDL?
-
22-10-2019 - |
题
我对SQL Server不太经验,所以也许我缺少一些东西
我的情况如下:
- Session 1使用AutoCommit OFF运行一个创建表(或其他创建语句),而创建则不算。
- 会议2运行
sp_table
陈述但只要第1次不犯DDL,就会挂起
发生这种情况的情况是在数据库上工作的开发人员。他们中的一些浏览桌子,其中一些在做DDL。如果一个用户忘记提交DDL所有其他想要列出表的会话。请注意 sp_tables
是由SQL客户端(通过JDBC驱动程序API)发出的,因此不能更改它。
我与之合作的数据库启用了SnapShot_isolation,并将隔离级别设置为读取订单(SET ALLOW_SNAPSHOT_ISOLATION ON
和 SET READ_COMMITTED_SNAPSHOT ON
)
我的假设是,这些设置应该使SQL Server在锁定并发会议上的行为更好(例如,任何作者永远不会阻止选择的PostgreSQL和Oracle) - 但显然不是这样。
因此,是否有任何方法可以使SQL Server对DDL的并发读/写入情况更加友好? (除了仅在自动命令模式下提交DDL之外)。
解决方案
没有,没有办法配置SQL Server来完成您想做的事情。
在快照隔离下 sp_tables
被阻止等待系统基础表之一上的共享键锁(sysschobjs
)做一个 SELECT
从 sys.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并终止会话并将其恢复。