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