如果我永远不会从另一个事务中读取volatile数据,那么在SqlTransaction中使用IsolationLevel有什么用处?

And*_*ena 2 .net sql-server ado.net transactions

我正在研究.NET Framework 4中的数据访问以获得Microsoft认证,我一直在做很多测试.

这一次,我想了解的目的,IsolationLevelSqlTransaction类.据我了解,这个选项允许我决定一个事务中的易失性数据是否可以被另一个事务访问.也就是说,例如:我在事务1中创建了一个数据行,在提交之前,我可以读取事务2中的数据.

事实是我无法从彼此中读取易失性数据.

  • 如果我与2个事务创建1个连接,则会出现异常,因为SQL Server不支持并行事务
  • 如果我创建2个连接,每个事务1个事务,无论IsolationLevel的值如何,当我尝试访问连接2中的数据而连接1处于事务中时,程序停止.当连接1离开事务时,程序继续.

那么.. IsolationLevel有什么用?

PS:我不是在谈论分布式事务,只是简单的SqlTransaction.

Rem*_*anu 9

2个线程上需要2个连接,2个事务.

线程1:

using (SqlConnection conn = GetSqlConnection())
{
  using (SqlTransaction trn = conn.BeginTransaction())
  {
    -- insert row into table here, then wait
  }
}
Run Code Online (Sandbox Code Playgroud)

线程2:

using (SqlConnection conn = GetSqlConnection())
{
  using (SqlTransaction trn = conn.BeginTransaction(IsolationLevel.<desiredlevel>))
  {
    -- wait for thread 1 to insert then read row inserted by thread 1 
  }
}
Run Code Online (Sandbox Code Playgroud)

ReadUncommited第二个线程下将读取该行.在Snapshot(如果在数据库中启用了快照)它将不会看到它,但它不会阻止.在所有其他隔离级别下,它将阻塞,直到线程1提交或回滚.

  • @Andre:这有点复杂。对于脏读、已提交读和快照,隔离级别确实适用于“我的事务如何看待世界?”。但是,一旦您考虑“RepeatableRead”和“Serialized”级别,隔离级别就开始意味着“其他人如何改变我的世界?”。在可重复读取下,其他人无法更改我看到的任何内容(一旦我触摸它,它就会一直在那里,不变,直到我提交),但其他人可能会在我的世界中插入*新*东西。在“可序列化”下,没有人可以修改我所看到的内容,但也没有人可以在我的世界中“插入”新内容。 (2认同)
  • 按照同样的比喻,“快照”隔离意味着“当我开始交易时,我的世界已经冻结”。尽管现实世界确实发生了变化,但我被困在时间里,当我开始快照交易时,我总是看到世界*原样*(我看到世界的*快照*)。当然,我在此快照中看到了我的*自己的*更改。 (2认同)