希望有人可以帮助我。
我们使用SharePoint 2007 Foundation并且我有一个用C#设计的应用程序,其中一部分是CAML查询,它返回订单传输的项目,根据输出它创建一个电子邮件附件并发送它。然后为每个项目设置新状态,例如'运输订单'。
问题是:
如果有人编辑同一个项目,哪个应用程序设置新状态会引发跟踪错误,则会发送带附件的电子邮件,但状态保持不变,并且在下次运行中是双重项目。
> System.Data.SqlClient.SqlException: Transaction (Process ID 89) 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.SqlInternalConnection.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.Data.SqlClient.SqlDataReader.Read()
at Microsoft.SharePoint.SPSqlClient.ExecuteQuery(Boolean& bSucceed)
at Microsoft.SharePoint.Library.SPRequestInternalClass.GetListItemDataWithCallback(String bstrUrl, String bstrListName, String bstrViewName, String bstrViewXml, SAFEARRAYFLAGS fSafeArrayFlags, ISP2DSafeArrayWriter pSACallback, ISPDataCallback pPagingCallback, ISPDataCallback pSchemaCallback)
at Microsoft.SharePoint.Library.SPRequest.GetListItemDataWithCallback(String bstrUrl, String bstrListName, String bstrViewName, String bstrViewXml, SAFEARRAYFLAGS fSafeArrayFlags, ISP2DSafeArrayWriter pSACallback, ISPDataCallback pPagingCallback, ISPDataCallback pSchemaCallback)
at Microsoft.SharePoint.SPListItemCollection.EnsureListItemsData()
at Microsoft.SharePoint.SPListItemCollection.GetItemIndexById(Int32 id)
at Microsoft.SharePoint.SPListItemCollection.GetItemById(Int32 id)
at ImportExportTool.Program.OrderTransportation(SPList planningList, SPField statusField) in c:\Users\MacProWin\OneDrive\Work\ImportExportTool v30 - source code\Program.cs:line 368
任何人都可以告诉我如何检查项目是否由其他用户编辑然后强制关闭它或者建议更好的解决方案?
以下是设置新状态的代码部分:
foreach (int orderItemId in orderedItemsIds)
{
SPListItem orderedItem = planningList.Items.GetItemById(orderItemId);
Common.Log(String.Format("Status Doprava Objednana is now set to Item: '{0}'", orderItemId));
SPFieldMultiChoiceValue statuses = new SPFieldMultiChoiceValue(orderedItem[Properties.Settings.Default.StatusFieldName].ToString());
statuses.Add("Doprava objednána");
orderedItem[Properties.Settings.Default.StatusFieldName] = statuses;
orderedItem.Update();
}
非常感谢。
马立克
答案 0 :(得分:0)
据我所知,如何检测"打开"项目。您可以检查已修改的字段,但它仅在上次更新时显示。
从架构师的角度来看,您应该将4-5个更新理想地组合到单个更新操作中,以最大限度地减少死锁问题。您还应该检查字段中的当前值(比较您要写入的实际值和值),以防止进行不必要的更新。
从技术角度(解决发生的问题),您应该首先处理重复操作的潜在事务异常(异常消息中建议的内容)。如果成功发送通知。