申请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可以做什么来确保实现这一目标?
针对长时间运行的交易的推理是您可以锁定您的数据库并使数据无法访问。通过锁读取风险符合ACID标准。登台表背后的原因是你可以像数据库一样使用你的数据库。 – 2008-12-25 05:53:21
我同意格雷格在这里。 – JoshBerke 2008-12-25 15:05:03