通过.net中的SqlTransaction禁用对表的读/写?

如何在.net 2.0中使用SqlTransaction,以便当我开始从表中读取数据时,该表被阻止其他人(其他程序)读取/写入该表?

如果SqlTransaction不是一个好的选择,那是什么?

在初始select语句中使用Serializable事务和TABLOCKX提示应该允许这样做。 TABLOCKX应该对表进行独占锁定,因此没有其他人可以使用该表,Serializable事务应该要求HOLDLOCK ,这意味着所有锁都保留到事务结束(您可以直接使用HOLDLOCK )。

更新:我刚刚在Management studio中测试了不同的场景,看起来您不需要显式使用Serializable事务。 在任何事务中使用TABLOCKX就足够了。

请注意,这种方法可能是一个很大的瓶颈,因为只有一个事务可以在这样的表上运行=没有并发性。 即使您阅读并使用了数百万的单个记录,在您的交易结束之前,其他任何人都无法使用该表。

所以命令看起来应该是这样的:

 SELECT * FROM Table WITH (TABLOCKX) WHERE ... 

要使用可序列化事务,您可以使用SqlTransaction

 using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); SqlTransaction transaction = connection.BeginTransaction(IsolationLevel.Serializable); try { ... transaction.Commit(); } catch (Exception) { transaction.Rollback(); ... } } 

System.Transactions.TransactionScope (默认隔离级别应为Serializable)。

 using (TransactionScope scope = new TransactionScope()) { using (SqlConnection connection = new SqlConnection(connectionString)) { ... } scope.Complete(); }