c# - 在 .net 中禁用通过 SqlTransaction 读/写表?

标签 c# .net sql-server vb.net ado.net

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

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

最佳答案

这应该通过在初始选择语句中使用 Serializable 事务和 TABLOCKX 提示来允许。 TABLOCKX 应该在表上取得独占锁,这样其他人就不能使用该表,Serializable transaction 应该要求 HOLDLOCK,这意味着所有锁都保持到事务结束(你可以直接使用HOLDLOCK)。

Update: I just tested different scenarios in Management studio and it looks like you do not need to explicitly use Serializable transaction. Using TABLOCKX within any transaction is enough.

请注意,这种方法可能是一个很大的瓶颈,因为只有一个事务可以在这样的表上操作 = 没有并发性。即使您读取和处理来自百万的单个记录,在您的事务结束之前,其他人也无法使用该表。

所以命令应该是这样的:

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();
}

关于c# - 在 .net 中禁用通过 SqlTransaction 读/写表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5018060/

相关文章:

c# - SqlException ErrorCode 返回 -2146232060 而不是 26(找不到服务器实例)

c# - 如何在 C# 中创建带有图标的 Internet 快捷方式?

没有 MessageBox,C# DLL 无法工作

c# - ViewBag 属性在单元测试中始终返回 null

c# - 更改 Int64 中的字节

c# - 如何使用 c# 以编程方式安装系统服务以使用组托管服务帐户 (gMSA)?

c# - 处理基于线路的网络 I/O 流的好方法是什么?

javascript - 为什么这个正则表达式匹配不正确的字符?

sql - 将行/记录中的多个数据合并到带有逗号分隔字段的一行中

sql-server - sql server中时间戳列的实际用途是什么?