以下是从一个transatcion修改表的代码。我知道为什么IsolationLevel Serializable读取没有被阻止,但是我无法从表中选择记录。如何在不阻止表中的选择的情况下运行事务?
TransactionOptions opt = new TransactionOptions();
opt.IsolationLevel = IsolationLevel.Serializable;
using (TransactionScope scope = new TransactionScope(
TransactionScopeOption.Required, opt))
{
// inserts record into table
myObj.MyAction();
// trying to select the table from Management Studio
myObj2.MyAction();
scope.Complete();
}
答案 0 :(得分:1)
有关SQL Server中隔离级别的说明,请查看http://msdn.microsoft.com/en-us/library/ms173763.aspx。 SERIALIZABLE提供最高级别的隔离并对表进行范围锁定,直到事务完成为止。您必须使用较低的隔离级别来允许在事务期间进行并发读取。
答案 1 :(得分:1)
您的(插入,更新等)代码运行的隔离级别无关紧要 - SELECT
正在运行的隔离级别很重要。
默认情况下,这是READ COMMITTED - 因此当表中有* un * commit数据时,SELECT查询无法继续。您可以使用SET TRANSACTION ISOLATION LEVEL更改选择运行的隔离级别,以使其无法读取。或者指定table hint(NOLOCK)。
但无论你做什么,都必须对运行select的连接/会话进行操作。你无法告诉SQL Server“请忽略其他连接设置的设置,只是打破他们的期望”。
如果您通常希望选择能够在数据库范围内继续,您可能会考虑启用READ_COMMITTED_SNAPSHOT。这是对数据库的全局更改 - 不是可以或应该为运行单个语句或一组语句而打开或关闭的内容,但它允许READ COMMITTED查询继续,而不需要锁定。
答案 2 :(得分:0)
Serializable是最高的交易级别。它将拥有最受限制的锁。
您希望使用Serializable的隔离级别保护什么。
阅读Commited Snapshot可能更合适,但我们需要更多信息才能确定。