Sql server 是否可以在事务发生时选择数据?

Sql server 是否可以在事务发生时选择数据?,sql-server,linq-to-sql,transactions,Sql Server,Linq To Sql,Transactions,我使用transactionscope来确保数据被正确地读取到数据库中。但是,在事务运行时,我可能需要从另一个页面选择一些数据。有可能这样做吗?说到数据库,我很不在行 我正在使用LinqToSQL和SQL Server 2005dev/2008prod。是的,在事务运行时仍然可以从数据库中选择数据 不受事务影响的数据例如,表中未更新的行通常可以从其他事务中读取。在某些情况下,SQL Server会引入一个表锁,停止对表中所有行的读取,但这是不寻常的,而且通常是查询或服务器上发生其他事情的征兆 您

我使用transactionscope来确保数据被正确地读取到数据库中。但是,在事务运行时,我可能需要从另一个页面选择一些数据。有可能这样做吗?说到数据库,我很不在行


我正在使用LinqToSQL和SQL Server 2005dev/2008prod。

是的,在事务运行时仍然可以从数据库中选择数据

不受事务影响的数据例如,表中未更新的行通常可以从其他事务中读取。在某些情况下,SQL Server会引入一个表锁,停止对表中所有行的读取,但这是不寻常的,而且通常是查询或服务器上发生其他事情的征兆

您需要仔细研究,因为这些控制着这种行为将如何工作

下面是设置事务作用域隔离级别的C代码

TransactionOptions option = new TransactionOptions();        
options.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;        
using (TransactionScope sc = new TransactionScope(TransactionScopeOption.Required, options)
{
    // Code within transaction
}
通常,根据事务上指定的事务隔离级别或任何表提示(如NOLOCK),您可以获得不同级别的数据锁定,以保护应用程序的其余部分不受事务中绑定的活动的影响。例如,如果事务隔离级别为READUNCOMMITTED,则可以在事务发生时查看该事务中的写操作。这允许脏读,但也防止了对数据的大多数锁定

规模的另一端是类似SERIALIZABLE的隔离级别,它确保事务活动在提交之前完全隔离。

是的,默认情况下,TransactionScope将锁定事务中涉及的表。如果需要在事务发生时读取,请输入另一个TransactionScope with TransactionOptions IsolationLevel.ReadUncommitted:

使用LINQ到SQL数据上下文:


请注意,System.Transactions.IsolationLevel和System.Data.IsolationLevel之间存在差异。是的,您读得没错。

与前面提供的建议不同,我强烈建议您研究快照隔离模型。会议上进行了很好的讨论。在数据库上启用读提交快照可以避免很多争用问题,因为读卡器不再被写入程序阻塞。由于默认读取是在读取提交隔离模式下执行的,因此此简单的数据库选项切换具有即时的好处,并且不需要在应用程序中进行任何更改

没有免费的午餐,所以这是有价格的,在这种情况下,价格是tempdb上的传统负载,请参阅


如果您使用的是明确的隔离级别,特别是使用默认的TransactionScope序列化模式,那么您必须检查代码以强制执行更有利的ReadCommitted隔离级别。如果你不知道你使用的隔离级别,那就意味着你使用了ReadCommitted。

一如既往,最好的答案是:你试过了吗?@delfuego:我不同意,因为有太多事情可能会出错。这类问题应该通过阅读或提问而不是尝试来回答。不过,我建议OP阅读一本或几本关于数据库的书。好吧,由于不准确,第一次否决投票是公平的,但是否决投票人很友好地发表了评论@第二个投票人:怎么了?
TransactionScopeOptions = new TransactionScopeOptions();
options.IsolationLevel = IsolationLevel.ReadUncommitted;
using(var scope = new TransactionScope(
    TransactionScopeOption.RequiresNew, 
    options
) {
    // read the database
}
// db is DataContext
db.Transaction = 
    db.Connection.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted);