Linq 中是否有任何工具可以显式锁定数据库或一组表?我正在使用几个不同的数据库,我正在寻找一些透明的东西。令我惊讶的是,除了处理 Linq 如何处理并发问题的主题之外,我找不到太多关于该主题的内容,这超出了我的范围。
或者,任何其他锁定数据库的简单方法对我来说都会很有趣(尤其是 MsSql,Sybase)
锁定数据库远远超出了 LINQ 的范围。唯一相关的锁定方面是特定提供者用来提供并发保证的锁定语义。如果您想要显式锁定超出事务处理自动应用的锁定,则需要进入较低级别。
要通过 Entity Framework执行任意 SQL 命令ExecuteStoreCommand
,您可以在数据库上下文中使用该方法,该方法只需要一个 SQL 字符串即可执行。如果由于某种原因您使用的是较旧的 LINQ2SQL 提供程序,它具有类似的ExecuteCommand
方法来实现相同的目标。
确实没有“数据库锁”(至少是数据库术语)这样的东西,因为整个数据库可以快速切换到独占访问模式并退出。对于 Sybase(和 MSSQL),具有适当权限的人可以通过设置“单一用户”选项来完成此操作:
sp_dboption mydatabase, "single user", true
这远没有锁定那么“简单”:这意味着一次只允许一个人连接到数据库,因此您需要确保在设置选项时已连接打开,并且没有其他人连接(他们将在没有警告的情况下启动),并且您在完成后将选项设置为关闭。
据我所知,在 MySql 中,除了更改每个人对目标数据库的权限之外,没有其他方法可以实现这一点。
锁定单个表要容易一些,因为大多数数据库服务器都有类似 SQL 的语法来执行此操作。在 MySql 中,您使用LOCK TABLES
带有READ
orWRITE
锁定的命令,但我强烈建议您阅读链接页面,因为 MySql 锁定工作(IMO)有点奇怪。Sybase 同样有一个LOCK TABLE
命令,在本例中称为SHARED
and EXCLUSIVE
。
您应该在事务的上下文中锁定表,因此您可能希望在TransactionScope
执行任何锁定之前将代码包装在 a 中。