我的应用程序需要缓存SQL Server元数据(表,列,索引等(。
它对系统表和诸如 sysobjects
之类的视图进行了几个后续查询。
有时数据同步过程同时运行以创建表和索引。
在这种情况下,查询元数据变得不一致:
- 应用程序读取表和列列表。
- 数据同步过程创建了新的表和索引。
- 应用程序读取索引列表,新索引用于"不存在"表。
一个简单的复制示例。
在会议1中:
-- 0. Drop example table if exists
if object_id('test') is not null drop table test
-- 1. Query tables (nothing returned)
select * from sysobjects where name = 'test'
-- 3. Query indexes (index returned for the new table)
select IndexName = x.name, TableName = o.name
from sysobjects o join sysindexes x on x.id = o.id
where o.name = 'test'
在第2节中:
-- 2. Create table with index
create table test (id int primary key)
是否有一种方法可以使元数据查询保持一致,类似于整个数据库或数据库架构上的架构修改锁?
以可序列化隔离级别的交易中运行元数据查询无济于事。
您可以"模拟"与sysobjects(表(的temp Table的一致性,然后使用此临时表查询属于该表的索引。这样:
if object_id('tempdb..#tempTables') is not null
drop table #tempTables;
select
*
into #tempTables
from sys.objects as o
where o.type = 'U'
select
*
from #tempTables t
select
i.*
from #tempTables t
inner join sys.indexes as i on t.object_id = i.object_id