我正在使用transactionscope来确保将数据正确读取到数据库中。但是,在事务运行时,我可能需要选择一些数据(从另一个页面)。可以这样做吗?关于数据库,我非常菜鸟。
我正在使用LinqToSQL和SQL Server 2005(dev)/ 2008(prod)。
最佳答案
是的,在事务运行时仍可以从数据库中选择数据。
不受事务影响的数据(例如,表中未更新的行)通常可以从其他事务中读取。 (在某些情况下,SQL Server会引入表锁,该表锁会停止对表中所有行的读取,但它们并不常见,并且通常是查询或服务器上发生其他事情的征兆)。
您需要研究Transaction Isolation Levels,因为它们可以精确控制此行为的工作方式。
这是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
,可确保事务活动完全隔离直到提交为止。关于sql-server - 进行交易时是否可以选择数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1918810/