Sql事务中的隔离级别

9 c# sql transactions sql-server-2005 sqlconnection

SqlTransaction在c#中实现了开始,提交和回滚事务.一切都很顺利,但是在访问交易期间连接的那些表时我遇到了一些问题.在交易期间我无法读取表格(那些在交易中的表格).在搜索这个时,我发现它是由于独占锁而发生的.依次对该数据的任何后续选择都必须等待释放独占锁.然后,我已经完成了所提供的每个隔离级别SqlTransaction,但它没有用.因此,我需要在事务期间释放独占锁,以便其他用户可以访问该表并可以读取数据.有没有办法实现这个目标?提前致谢.

这是我的交易的c#代码

try
{
  SqlTransaction transaction = null;                         
  using (SqlConnection connection=new SqlConnection(Connection.ConnectionString))
  {
       connection.Open();
       transaction=connection.BeginTransaction(IsolationLevel.Snapshot,"FaresheetTransaction");            
       //Here all transaction occurs   
       if (transaction.Connection != null)
       {     
               transaction.Commit();
               transaction.Dispose();
       } 
   }
}
catch (Exception ex)
{
   if (transaction.Connection != null)
       transaction.Rollback();
   transaction.Dispose();   
}   `                         
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常,但问题是当我在事务处理期间访问表的数据(在事务期间访问的那些)时.这些表正由应用程序的其他部分访问.因此,当我尝试从表中读取数据时,它会抛出异常.

Mar*_*ell 15

根据设计,SQL事务是ACID.特别是,"I"在这里伤害了你 - 这是为了防止其他连接看到不一致的中间状态.

单个读取连接可以通过使用NOLOCK提示或READ UNCOMMITTED隔离级别来选择忽略此规则,但听起来您想要的是写入连接不带锁.好吧,那不会发生.

但是,对于读者来说,使用快照隔离可能会有所帮助,这可以在没有读取器锁定的情况下实现隔离(通过查看,如名称所示,在事务启动时查看一致状态的时间点).

但是,IMO你最好建议你看看:

  • 来自作者的多个,更细粒度的事务
  • 在临时表(数据的并行副本)中执行工作,然后在少量大量插入/更新/删除操作中将其合并到实际数据中,从而最大限度地缩短事务时间

第一个更简单.

一个简单的事实是:如果你采取一个长期运行的事务,操作大量数据,是的,你将导致问题.这就是你不这样做的原因.系统运行正常.

  • 你的第二个解决方案几乎就是当快照隔离用于执行写入的事务时为你做的事情;) (2认同)