锁定 C# Linq 4.0 中的数据库或一组表



Linq 中是否有任何工具可以明确锁定一个数据库或一组表?我正在使用几个不同的数据库,我正在寻找透明的东西。令我惊讶的是,除了处理 Linq 如何处理并发问题的主题之外,我找不到太多关于这个主题的内容,这超出了我的范围。

或者,任何其他锁定数据库的简单方法对我来说都会很有趣(MsSql,特别是Sybase)

锁定数据库远远超出了 LINQ 的范围;唯一相关的锁定方面是特定提供程序用于提供并发保证的锁定语义。如果您想要显式锁而不是事务处理自动应用的锁,则需要转到较低级别。

若要通过实体框架执行任意 SQL 命令,可以在数据库上下文上使用 ExecuteStoreCommand 方法,该方法只需要一个 SQL 字符串即可执行。如果出于某种原因使用较旧的LINQ2SQL提供程序,则它具有类似的ExecuteCommand方法来实现相同的目标。

实际上没有"数据库锁"这样的东西(至少它是数据库术语),从某种意义上说,整个数据库可以快速切换到独占访问模式并退出。对于Sybase(和MSSQL),具有适当权限的人可以通过设置"单用户"选项来实现此目的:

sp_dboption mydatabase, "single user", true

这远没有锁定那么"简单":这意味着一次只允许一个人连接到数据库,因此您需要确保在设置选项时已连接,并且没有其他人连接(他们将在没有警告的情况下被踢出), 并且完成后将选项设置回

据我所知,在MySql中,除了更改每个人对目标数据库的权限之外,没有办法做到这一点。

锁定单个表要容易一些,因为大多数数据库服务器都有类似 SQL 的语法来执行此操作。在MySql中,您使用LOCK TABLES命令,带有READWRITE锁,尽管我强烈建议您阅读链接页面,因为MySql锁定的工作方式(IMO)有些奇怪。Sybase 同样有一个LOCK TABLE命令,在本例中称为 SHAREDEXCLUSIVE

您需要在事务上下文中锁定表,因此您可能希望在执行任何锁定之前将代码包装在TransactionScope中。

最新更新