2008-12-25 105 views
1

申请1 -如何避免.NET 3.0/WinForms/SQLServer 2005中的这种阻塞情况?

  • 打开一个SqlConnection和对一个SQLServer一个的SqlTransaction 2005数据库
  • 插入一条记录表1
  • 不提交或回滚的的SqlTransaction - intentially保持这个活证明/描述该问题

应用2 -

  • 打开的SqlConnection和反对的SqlTransaction一个SQLServer 2005数据库
  • 尝试运行此查询 - “SELECT COUNT(同上)FROM表1”

表1 - id是一个标识字段。名称是一个varchar字段。表中没有其他字段

应用程序2无法运行“SELECT ...”查询。似乎Table1被应用程序1中的插入操作锁定或阻止。

尽管上面提到的场景是虚构的 - 它证明了我们正在充分面对的问题。我们希望能够打开一个长时间运行的SqlTransaction(也许是几个小时)并通过该SqlTransaction执行许多插入/更新。

我们正在开发一个数据转换应用程序,它可以在插入/更新到数据库之前对很多数据进行大量处理。数据转换将在我们的主要基于WebForms的应用程序运行在我们想要执行长时间运行的事务的同一SQLServer 2005数据库上时发生。

我们应用程序中的所有表都被ClientMaster表中的ClientID字段分割。例如,如果我们有一个CollegeMaster表,那么它将具有作为主键的一部分的ClientID字段和用于其自身标识的ID字段。数据转换首先创建一个新的ClientID,并在所有其他表中使用新的ClientID字段。

理想情况下,应用程序2中提到的所有查询都不应受长时间运行事务影响。那些查询应该只读取/使用已经提交并且继续工作的数据,而不是由于长时间运行的事务而被阻塞。应用程序1可以做什么来确保实现这一目标?

回答

1

我建议不要长时间运行交易;然而,这样说:

您可以通过使用提示降低事务隔离级别。我通常不会推荐这种做法,但是如果您的选择是这样做的话:

从Table1(NOLOCK)中选择count(id)您将通过传递表上的所有锁;然而,要注意的是,你可以并且最终会得到脏读,幻读(数据有一分钟但不是下一个)。如果你的查询是分段的,那么你应该没问题。在线图书还有其他提示。

其他选项是在暂存表中执行所有长时间运行的处理,然后在table1中执行最后一个复制/插入操作。这将有助于缩短交易时间。

0

长时间运行的数据转换事务背后的推理是SQLServer 2005已经具有回滚功能。如果数据转换出现问题,我们可以使用该工具来回滚插入/更新的数据。

对临时表的推理是我们有很多身份字段,在并发情况下很难跟踪。在从实际源表转换为登台表时,我们将在“主”表中生成一组身份值,这些值将在“子”登台表中进一步使用。接下来,在将数据从登台表推送到目标表时,我们必须确保为“主”表生成的新标识值被正确映射并传播到“子”表。

+0

针对长时间运行的交易的推理是您可以锁定您的数据库并使数据无法访问。通过锁读取风险符合ACID标准。登台表背后的原因是你可以像数据库一样使用你的数据库。 – 2008-12-25 05:53:21

+0

我同意格雷格在这里。 – JoshBerke 2008-12-25 15:05:03

0

为什么不保存在数据集中的所有变化,并全部提交一次?这不会解决长时间运行的交易问题吗?

相关问题