如何在.net 2.0中使用SqlTransaction,以便当我开始从表中读取数据时,该表被阻止其他人(其他程序)读取/写入该表?
如果SqlTransaction不是一个好的选择,那么是什么?
答案 0 :(得分:7)
在初始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();
}