我是Transact sql编程的新手.
我创建了一个存储过程,它将删除并创建一个现有的同义词,以便它指向另一个表.存储过程包含2个参数:
> synonymName – 现有的同义词
> nextTable – 要指向的表
这是代码片段:
... BEGIN TRAN SwitchTran SET @sqlCommand='drop synonym ' + @synonymName EXEC sp_executesql @sqlCommand SET @sqlCommand='create synonym ' + @synonymName + ' for ' + @nextTable EXEC sp_executesql @sqlCommand COMMIT SwitchTran ...
我们有一个应用程序可以定期使用同义词写入数据.
我的问题是,我是否会遇到同义词被删除的竞争条件,而应用程序尝试写入同义词?
如果以上是一个问题,有人可以给我解决方案的建议.
谢谢
解决方法
是的,你有一个竞争条件.
管理此方法的一种方法是在事务模式下在BEGIN TRAN之后使用sp_getapplock并根据需要捕获/处理返回状态.这将在字面上串行(在执行意义上,而不是隔离)调用者,因此在任何时候只执行一个SPID.