我有一个分布式应用程序,其中多个服务器上的多个进程连接到SQL Server数据库。
我需要在第一次启动时迁移代码中的数据库模式,因为升级部署可以由没有数据库访问权限(我们使用计算机对象数据库访问权限)的用户完成。
目前,这是通过提供一个带有语句的sql文件来完成的,然后拥有db访问权限(但可能没有应用程序访问权限)的用户将独立运行它。
因为应用程序不能相互通信(防火墙、不同的DC等)我在想,我必须将一个服务器指定为“主”,所有其他服务器都指定为“从”,然后在主服务器上,启动的第一个进程将获得互斥并执行模式迁移;所有其他服务器可以简单地等待,直到它们可以看到模式被迁移。
然而,这对我来说有一种代码的味道。
我试图研究Entity Framework如何在代码优先迁移中处理这一点,但似乎不是这样(例如,如果两个进程同时启动,它们都会尝试迁移模式)。
还有其他方法吗?
发布于 2015-09-14 17:37:16
您可以将数据库模式更改为单用户(其他连接)将被拒绝。进行更改,然后改回多用户模式。
编辑:
这里有一个技巧,如何获得“互斥”。您可以更新/删除记录。在事务打开之前,排它锁仍然保持不变。很可能,如果您从事务中的每个表中删除0条记录(带有表锁提示),您可能会为数据库用户实现与“全局互斥”相同的行为。但我不知道模式更改会有什么行为。
https://stackoverflow.com/questions/32560969
复制相似问题