gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:45:40 25 4
gpt4 key购买 nike

如何在 .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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com