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

Thi*_* it 4 .net c# vb.net sql-server ado.net

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

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

Lad*_*nka 7

这应该是通过TABLOCKX在初始select语句中使用Serializable事务和提示来允许的.TABLOCKX应该对表进行独占锁定,以便其他人无法使用该表,Serializable事务应该要求HOLDLOCK,这意味着所有锁都保留到事务结束(您可以HOLDLOCK直接使用).

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

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

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

SELECT * FROM Table WITH (TABLOCKX) WHERE ...
Run Code Online (Sandbox Code Playgroud)

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

using (SqlConnection connection = new SqlConnection(connectionString))
{
  connection.Open();
  SqlTransaction transaction = connection.BeginTransaction(IsolationLevel.Serializable);

  try
  {
    ...
    transaction.Commit();
  }
  catch (Exception)
  {
    transaction.Rollback();
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

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

using (TransactionScope scope = new TransactionScope())
{
  using (SqlConnection connection = new SqlConnection(connectionString))
  {
    ...
  }
  scope.Complete();
}
Run Code Online (Sandbox Code Playgroud)