【发布时间】:2010-11-12 12:35:52
【问题描述】:
我正在使用一些商业模式,它们有一组相似的表,它们仅在语言名称上有所不同,例如:
Products_en
Products_fr
Products_de
我还有几个存储过程,我用来访问这些存储过程以执行一些管理功能,我选择使用同义词,因为代码很多,而且将所有内容都写成动态 SQL 很痛苦:
declare @lang varchar(50) = 'en'
if object_id('dbo.ProductsTable', 'sn') is not null drop synonym dbo.ProductsTable
exec('create synonym dbo.ProductsTable for dbo.Products_' + @lang)
/* Call the synonym table */
select top 10 * from dbo.ProductsTable
update ProductsTable set a = 'b'
我的问题是 SQL Server 在并发访问时如何处理同义词?我担心一个程序可能会启动,然后第二个程序会出现并更改同义词指向的表,从而导致重大问题。我可以将所有内容包装在 BEGIN TRAN 和 COMMIT TRAN 中,理论上这应该消除两个进程更改同义词的风险,但是关于这件事的文档很少,我无法得到明确的答案。
请注意,虽然这个系统是并发的,但它的流量并不高,因此使用同义词/事务的性能损失在这里并不是真正的问题。
感谢您的任何建议。
【问题讨论】:
-
“商业模式”是什么意思?这是否意味着您不能修改数据库架构本身(即只能添加到其中)?
-
它们是商业产品(Microsoft Commerce Server)的一部分,所以我可以添加它们,但我不能更改 API 依赖的约定或其他内容
标签: sql tsql sql-server-2008 concurrency transactions