使用SqlWorkflowPersistenceService时,在PersistenceDBAccessor.RetrieveNonblockingInstanceStateIds中获取SqlException死锁

时间:2010-03-10 23:07:56

标签: workflow-foundation

我正在使用WF 3.5,在启动几个WorkflowRuntimes的过程中,我有时会遇到以下异常:

System.Data.SqlClient.SqlException: Transaction (Process ID 108) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlDataReader.HasMoreRows()
   at System.Data.SqlClient.SqlDataReader.ReadInternal(Boolean setTimeout)
   at System.Workflow.Runtime.Hosting.PersistenceDBAccessor.RetrieveNonblockingInstanceStateIds(Guid ownerId, DateTime ownedUntil)
   at System.Workflow.Runtime.Hosting.SqlWorkflowPersistenceService.RecoverRunningWorkflowInstances()
   at System.Workflow.Runtime.Hosting.SqlWorkflowPersistenceService.OnStarted()
   at System.EventHandler`1.Invoke(Object sender, TEventArgs e)
   at System.Workflow.Runtime.WorkflowRuntime.StartRuntime()

我认为运行多个WorkflowRuntimes是可以的。我正在加倍,因为我正在将工作负载分配给不同的服务器,但所有服务器都在同一个数据库中。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

找到了答案!

我应该使用启用锁定的SqlWorkflowPersistenceService构造函数:

SqlWorkflowPersistenceService构造函数(String,Boolean,TimeSpan,TimeSpan) http://msdn.microsoft.com/en-us/library/ms608171(v=VS.90).aspx

有关详细信息:https://connect.microsoft.com/wf/feedback/details/541240/sqlexception-deadlock-in-persistencedbaccessor-retrievenonblockinginstancestateids