CRM2011 concurrency问题及解决方案

CRM2011对删除和添加操作会自动做判断,比如A打开纪录x,B也打开纪录x,然后B删除了纪录x,A去更新的话就会有提示。更新的话是后者覆盖前者,比如A打开纪录x,B打开纪录x,然后B把记录x中的字段y更新成了3,然后点保存,A把字段y更新成了5保存,最后5会覆盖3。这篇日志解决的问题就是当A改成5想保存的时候提示记录x已在某个时间点被某人更新过了,如果继续保存就会覆盖记录,否则放弃保存。

用js完成整个验证,然后注册form的onload和onsave达到目的,当然也要添加jquery和json2两个js类库

上js先


var previousModificationDateOnLoad;
//var serverUrl = Xrm.Page.context.getServerUrl();
var serverUrl = document.location.protocol + "//" + document.location.host + "/" + Xrm.Page.context.getOrgUniqueName();
var ODATA_ENDPOINT = "/XRMServices/2011/OrganizationData.svc";
var recordId;
var entityName;
function getPreviousModificationDate()
{
recordId = Xrm.Page.data.entity.getId().replace(‘{‘,‘‘).replace(‘}‘,‘‘);
entityName = Xrm.Page.data.entity.getEntityName() + "Set";
previousModificationDateOnLoad = new Date();
retrieveRecord(recordId,entityName, function(data){
previousModificationDateOnLoad = data.ModifiedOn;
previousModificationDateOnLoad = new Date(parseInt(/\/Date\((\d+).*/.exec(previousModificationDateOnLoad)[1]));
},null, false);
//alert(previousModificationDateOnLoad);
}

function validateConcurrency(ExecutionObj)
{
if(Xrm.Page.ui.getFormType()==1)
{
return;
}
var previousModificationDateOnSave, previousModifiedByOnSave;
retrieveRecord(recordId,entityName, function(data){
previousModificationDateOnSave = data.ModifiedOn;
//alert(previousModificationDateOnSave);
previousModifiedByOnSave = data.ModifiedBy.Name;
//alert(previousModifiedByOnSave);
//change timestamp to date format
previousModificationDateOnSave = new Date(parseInt(/\/Date\((\d+).*/.exec(previousModificationDateOnSave)[1]));
//alert(previousModificationDateOnLoad + "\n"+previousModificationDateOnSave)
if(previousModificationDateOnLoad < previousModificationDateOnSave)
{
var continueSave = confirm("The record was recently modified by "+previousModifiedByOnSave+ " On " +
previousModificationDateOnSave + ".If you chose to save this record you will overwrite the recent changes made by "+
previousModifiedByOnSave+"\nAre you sure you want to save this record?");
if(!continueSave)
{
ExecutionObj.getEventArgs().preventDefault();
event.returnValue = false;

}
}
//previousModificationDateOnLoad = previousModificationDateOnSave;
},null, false);
}

function retrieveRecord(id, odataSetName,successCallback, errorCallback, aSync)
{
if(aSync==null || aSync==undefined)
{
aSync = true;
}
//alert(serverUrl +ODATA_ENDPOINT +"/"+odataSetName+"(guid‘"+id+"‘)");
$.ajax({
type:"GET",
contentType:"application/json;charset=utf-8",
datatype:"json",
async:aSync,
url:serverUrl +ODATA_ENDPOINT +"/"+odataSetName+"(guid‘"+id+"‘)",
beforeSend:function(XMLHttpRequest){
XMLHttpRequest.setRequestHeader("Accept","application/json");
},
success:function(data,textStatus,XmlHttpRequest){
if(successCallback){
successCallback(data.d,textStatus,XmlHttpRequest);
}
},
error:function(XmlHttpRequest,textStatus,errorThrown){
alert("error");
if(errorCallback){
errorCallback(XmlHttpRequest,textStatus,errorThrown);
}
}
});
}

CRM中的配置

然后选中validateConcurrency点击Edit,勾选Pass execution context as first parameter

就这些配置,可以实现排他机制咯。

时间: 2024-10-06 12:18:19

CRM2011 concurrency问题及解决方案的相关文章

Dynamics CRM2011 导入解决方案报根组件插入错误的解决方法

今天在还原一个老版本的解决方案,在导入时报根组件插入问题"Cannot add a Root Component 38974590-9322-e311-b365-00155d810a00 of type 31 because it is not in the target system".我们的第一反应肯定是去customizations.xml中查询与之相关的组件,删除后发现还是报错,这时你需要去查找solution.xml把里面与之相关的RootComponent删除才可以. 参考

深入浅出 Java Concurrency (15): 锁机制 part 10 锁的一些其它问题[转]

主要谈谈锁的性能以及其它一些理论知识,内容主要的出处是<Java Concurrency in Practice>,结合自己的理解和实际应用对锁机制进行一个小小的总结. 首先需要强调的一点是:所有锁(包括内置锁和高级锁)都是有性能消耗的,也就是说在高并发的情况下,由于锁机制带来的上下文切换.资源同步等消耗是非常可观的.在某些极端情况下,线程在锁上的消耗可能比线程本身的消耗还要多.所以如果可能的话,在任何情况下都尽量少用锁,如果不可避免那么采用非阻塞算法是一个不错的解决方案,但是却也不是绝对的.

MySQL 作为新的 NoSQL 解决方案: 轻松应对亿级数据

MySQL现在是一个更好的NoSQL解决方案.我们这样说是因为在存储 键/值(key/value) 之类数据时, MySQL 具有性能.易用性和稳定性方面的优势.MySQL引擎稳定可靠,并且社区和官方支持良好,有非常丰富的在线资料, 涵盖了各种操作.故障排查,复制以及各种使用模式等方面.基于这个原因, MySQL比起新兴的NoSQL引擎具有很大优势. 近年来,NoSQL引擎已成为主流.许多开发者将NoSQL引擎(包括: MongoDB, Cassandra, Redis, 和 Hadoop等)视

Atitit ACID解决方案2PC(两阶段提交)&#160;&#160;跨越多个数据库实例的ACID保证

Atitit ACID解决方案2PC(两阶段提交)  跨越多个数据库实例的ACID保证 1.1. ACID解决方案1 1.2. 数据库厂商在很久以前就认识到数据库分区的必要性,并引入了一种称为2PC(两阶段提交)的技术来提供跨越多个数据库实例的ACID保证.这个协议分为以下两个阶段:1 1.3. 基本上,数据库实现 ACID 最关键的技术是日志和锁.2 1.4. I- 实现事务隔离的主要手段是锁.另外一个关键技术是  MVCC (Multi-version Concurrency Control

CRM2011 更改字段类型,又不删除原有数据

场景:导入解决方案时,如果一个实体的字段属性类型,发生了变化,则解决方案导入失败: 解决办法: 方案一:直接更改数据库的数据类型 select * from new_MSCRM.MetadataSchema.AttributeTypes select * from new_MSCRM.MetadataSchema.Entity where Name='EntityName' select * from new_MSCRM.MetadataSchema.Attribute where Entity

2、CRM2011编程实战——设置窗体某一项的值为服务器时间

需求:设置窗体中某个控件的值为服务器时间. 解决方案:通过一个一般处理程序获取服务器时间,然后通过ajax形式获取到此服务器时间并赋值给界面控件. 1.新建一个一般处理程序GetSererTimeHandler.ashx, 代码如下: <%@ WebHandler Language="C#" Class="GetSererTimeHandler" %> using System; using System.Web; namespace IsWaterWe

3、CRM2011编程实战——选项集(下拉框)联动效果的实现

需求:根据选择不同的"反映类别",帅选出不同的"反映内容". 字段说明:反映类别:hxcs_feedbacktype,反映内容:hxcs_feedbacktype 解决方案:要设置两个选项集的关联,我们可以为两个选项集设置value的时候,做一些特殊的处理.举例:假设类别的Value:1001,1002,那么对应的内容可以设置为:类别value+00001,即100100001,以此类推.如下图: Js代码如下: function onFeedBackTypeCha

5、CRM2011编程实战——在CRM中添加修改密码功能

需求:登录CRM2011的用户,让其可以自己修改密码. 解决方案:新建一个自定义页面,为其提供修改域账号功能.第一步:获取当前域账号,第二步:修改当前域账号密码. 新建aspx页面ResetUserPassword.aspx,前台代码如下: <%@Page Language="C#" AutoEventWireup="true" CodeBehind="ResetUserPassword.aspx.cs" Inherits="Hu

c++11 多线程间共享数据 &lt;c++ concurrency in action&gt;

本章主要描述多线程之间共享数据的方法.存在问题.解决方案. 第一部分:mutex在保护共享数据中的使用 1.最简单使用: #include<mutex> std::mutex some_mutex; void func(){ some_mutex.lock(); //访问共享数据 .... some_mutex.unlock(); } 2.向lock_guard推进: 但是不推荐直接使用lock.unlock,因为unlock一定要调用,如果由于你的疏忽或前面的异常将会导致问题,再次利用RAI