操作系统问个难点:这种景观下,当呼吁速度快

作者:操作系统

打个举例,三个web程序中提代替金券的例证首先数据库中:有一个字段代表是或不是领取过代金券程序中:先读取数据库,判别该字段值,true则领取过,分化意再度提取,false则展开下一步领取,同等对待新发送sql设置标志字段为true那么当接二连三2个哀告快到一定程度,约等于在领取形式中读取数据库剖断尚未成功在此以前第二个央求又进入该措施了,会否突破验证?笔者觉着应该是不能够的啊,始终应该会有一个程序的?

 

方法。。。。

直白上得以work的减轻办法吗。。。

操作系统 1

right

既然[ ], string都不可能作保第三次上传Excel成功,确定是因为品种的原因,那即使本身把sroi改为空的{ }就足以确定保障第三回Excel上传成功了。所以,首先把sroi字段置为null,再次置为{ }。。。好啊,接下去只增添前端突显部分的推断就好了。

(´థ౪థ)σ

我测量检验

  1. EntityTypeConfiguration类中,需求调用什么艺术将三本品质标识为并发属性?
  2. 哪风流罗曼蒂克种特别类型表示并发错误?

若果您感觉那篇文章对你有价值也许具备收获,请点击右下方的店长推荐,然后查看答案,感激!
翻开答案


参照书籍:
《Mastering Entity Framework》
《Code-First Development with Entity Framework》
《Programming Entity Framework Code First》

假定你以为这篇小说还不易可能具备收获,您能够通过右边的“打赏”功能 打赏作者黄金时代杯咖啡【物质支持】,也足以点击右下角的【店长推荐】开关【精气神支撑】,因为那三种帮忙都以本人继续写作,共享的最大重力!接待我们投入QQ群交换:365987756 操作系统 2

作者:tkb至简

来源:

声称:原创博客请在转发时保留原来的文章链接可能在篇章初叶加上本身博客地址,如开采错误,接待争辨指正。凡是转发于小编的稿子,不能够设置打赏作用,如有特需请与本人联系!

 

主题素材叙述:

要求校订的连串某页面如下图所示:

操作系统 3

需修改的页面

当客商点击铁黄的“选拔文件”开关将科学的SROI模板上传至系统,系统会自行深入分析上传的SROI模板,并将解析后的数量显示在“区域1”,与其同期,上传的Excel文件名显示在区域2。

当用户点击“删除”button时,区域第22中学的文件会被删去,区域1中的数据不会被删除。大家希望的结果是:当点击“删除”button后,区域1和区域2的数额能够一齐被去除。

提个醒/询问客户

当八个客户尝试更新一个笔录时,不过该记录自从她读取之后生机勃勃度被人家改变了,这个时候应用程序就能够警示该客户该数量已经被有些人修正了,然后询问他是还是不是依然要重写该多少大概率先检查已经更新的数码。

 

方法二:

既是无法平素删除,那就直接删除吧。

先经过get乞求把project音信都取到,通过代码手动将sroi字段删除,再用update把新project更新到数据库中。

操作系统 4

get project

操作系统 5

get project response

能够窥见response里比mongo里多了风华正茂部分大家不想要的字段,(所谓Promise,轻巧说就是四个容器,里面保存着某些现在才会甘休的事件(经常是二个异步操作)的结果),固然通过操作把sroi和sroi_result删除,也会在update的时候把剩余字段参加到数据库中,进而引进脏数据。那些法子又被免去。

知情现身

并发管理消灭的是同意多个实体同期更新,实际上那表示允许同有的时候间在相近的数目上实施八个数据库操作。并发是在三个数据库上管理多个操作的黄金年代种格局,相同的时间听从了数据库操作的ACID属性(原子性,后生可畏致性,隔绝性和持久性)

假造一下底下三种大概产生并发的光景:

  • 顾客甲和乙都尝试修正形似的实体
  • 客户甲和乙都尝试删除肖似的实业
  • 客商甲正在尝试改善五个实体时,客商乙已经删除了该实体
  • 客户甲已经号令读取叁个实体,客商乙读完该实体之后更新了它

这个场景恐怕会潜在地产生错误的数码,试想,成都百货上千的客户同时尝试操作叁个雷同的实体,这种现身难题将会对系统带给更加大的影响。

在管理与出新相关的标题时,日常常有二种艺术:

  • 积极并发:无论什么时候从数据库诉求数据,数据都会被读取并保存到使用内部存储器中。数据库品级未有放置任何显式锁。数据操作会根据数据层采用到的逐一试行。
  • 被动并发:无论曾几何时从数据库央浼数据,数据都会被读取,然后该数量上就能够加锁,因而未曾人能访谈该多少。那会减低并发相关主题材料的火候,劣势是加锁是三个值钱的操作,会下落整个应用程序的习性。EF默许辅助积极并发,那样,少年老成旦有所的多寡被读取,就能够呈今后内部存款和储蓄器中。当然,也能够陈设EF使用悲伤并发,可是EF不直接扶助。

方法四:

操作系统 6

upload 前端

操作系统 7

deal sroi file api

先是次上传Excel表后,数据库project里已经存在了sroi字段,当第二遍再上传Excel表,第壹次表的故事情节会将率先次的多少覆盖掉。我们能够看来,当前端发送upload request后,后端会吸纳到Excel表并对其进行拍卖和封存,91,92和94行正是使用EVE将数据存入数据库。

从这些思路中,大家想到了其余黄金年代种减轻方法:当点击“delete button”时,使用同upload相近的覆辙,只不过将result、formatData数据置空,同期采取put格局将数据update至数据库。

操作系统 8

测试 method4 代码

在代码中,头阵送post央求将Excel消息save到数据库中,再选取put方式变相毁灭数据。看似没不正常的测验代码,不过结果却是那样的。╮(╯▽╰卡塔尔╭

操作系统 9

result

非但把sroi删除了,还把project中任何字段也删除了。 (`皿´State of Qatar好呢,put方法是整个更新,那时候理应用patch方法改正部分消息。

于是,又初始看代码中httpClient部分的发送央浼,然则笔者看见了什么。。。。

操作系统 10

httpclient

无名氏的在风中混杂了。。。_(:з」∠)_有如早就把路走绝了。。

局地更新

在这里种情形中,大家也允许具有的退换,可是不会更新完整的行,唯有一定顾客具有的列更新了。那就意味着,如若八个客户更新相似的记录但却今是昨非的列,那么那多个更新都会成功,并且来自那多个客户的改善都是可知的。

 protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack)
            {
                Response.Write("这是回发后的页面!"); //点击button1控件后出现这个
            }
            else
            {
                Response.Write("这是首次加载的页面!"); //第一次预览出现这个
            }
        }

代码中的消除方法及难题一定:

既是会发出点击“删除”开关后,意气风发处删除掉了,豆蔻梢头处未有删除掉的景观,分明是代码中冒出了难题。以往就从头拆解分析代码的写法。

操作系统 11

幸存代码

经过代码72--77行,大家能够见见,在点击“删除”开关后,会弹出提示框,然后试行deleteAttachment function。Attachment.delete具体落实如下:

操作系统 12

Attachment.delete

PS:项目应用的数据库是mongo,使用EVE对数据库实行操作。EVE官方文书档案上写着:Eveis an open source Python REST API framework designed for human beings. It allows to effortlessly build and deploy highly customizable, fully featured RESTful Web Services.

当接触删除操作后,会平素发送delete伏乞至EVE,然后删除数据Curry的多少。那到底删除了数据库的怎么着数据吧?

数据库的构造轮廓上是那般的:八个attachment的collection,特地存放各样附加Excel、图片等新闻;贰个project的collection,寄存项指标主干信息。当触发delete操作后,前端发送了“$http.delete('/api/doc/files/attachment/projectId'卡塔尔国”,对数据库中attachment举行了除去。与此同期,页面上区域2的多寡,也便是attachment也被剔除掉。而上传的Excel经过后台代码深入分析后,会将Excel中的数据存入project collection的sroi filed中,而页面上区域1的音讯正是依照project collection的sroi filed彰显的。所以,只供给把project collection中的sroi filed删除掉,就能够消除中期的标题。

采纳TransactionScope处监护人务

若果有二个景色有所多少个DbContext目的,那么我们想将波及七个DbContext对象的操作关联为四个行事单元,那时候,大家需求在TransactionScope对象内部包裹SaveChanges艺术的调用。为了描述这一个地方,大家选取DbContext类的多少个分裂实例来奉行扣款和收款:

 #region 5.0  使用TransactionScope处理事务
 int outputId = 2, inputId = 1;
 decimal transferAmount = 1000m;
 using (var ts=new TransactionScope(TransactionScopeOption.Required))
 {
     var db1=new Context();
     var db2=new Context();
     //1 检索事务中涉及的账户
     var outputAccount = db1.OutputAccounts.Find(outputId);
     var inputAccount = db2.InputAccounts.Find(inputId);
     //2 从输出账户上扣除1000
     outputAccount.Balance -= transferAmount;
     //3 从输入账户上增加1000
     inputAccount.Balance  = transferAmount;

     db1.SaveChanges();
     db2.SaveChanges();

     ts.Complete();
 }
 #endregion

地方的代码中,我们运用了四个不等的DbContext实例施行扣款和收款操作。由此,默许的EF行为不会工作。在调用各自的SaveChanges()方法时,和上下文相关的顺序业务不会付给。相反,因为它们都在TransactionScope目的的里边,所以,当TransactionScope对象的Complete()办法调用时,事务才会付出。假如别的三个操作失败,就能够时有产生十分,TransactionScope就不会调用Complete()格局,从而回滚修正。


消除思路:



方法五:

在艺术一中聊到,不能用unset将点名字段删除掉,不过它无法阻挡笔者把内定字段替换掉啊。假使自身把sroi中的内容用[ ]交替掉,只要求在前端展现的时候推断sroi内容是不是为[ ]即可了 。

操作系统 13

patch sroi to [ ]

操作系统 14

result

总的来看就像瓜熟蒂落了,能够成功替换为空。上面只须求构思三个难点:改前端有sroi的有个别,加上推断规范;再一次上传Excel是或不是能不负任务。

率先个难点专业量大可是挺简单,先来看第三个吗。彡(-_-;State of Qatar彡不能够上传成功!不能!不!!!

当然把[ ]换到了null,string如故不能够承保第一遍上传成功,好吧。You win!

规划管理字段品级现身的利用

接下去,大家会看出哪些编写管理字段级并发难点的接纳代码。这种方法设计使用的思考是,独有更新的字段会在数据库中改造。那个就确定保证了借使多个顾客正在更新分化的字段,全数的变动都会持久化到数据库。

贯彻那一个的基本点是让该采用识别客户正在呼吁更新的装有列,然后为该客商有选拔地更新那二个字段。通过以下三个东西来落到实处:

  • 一个措施:该格局会给大家七个原始模型的仿制,独有客商要求的脾性会更新为新值
  • 更新措施:它会检查原始央求模型的哪位属性值已经转移,然后在数据库中只更新这一个值。

故而,首先需求创建三个简洁明了的诀窍,该方法供给模型属性的值,然后会回来多少个新的模型,该模型除了顾客尝试更新的习性之外,别的的属性值都和原先的模型属性值肖似。

static Donator GetUpdatedDonator(int id,string name,decimal amount,DateTime donateDate)
{
    return new Donator
    {
        Id = id,
        Name = name,
        Amount = amount,
        DonateDate = donateDate
    };
}

假设客商只想翻新Amount字段,方法的调用就疑似上面那样:

var donator1 = GetDonator(1);
var donator2 = GetDonator(1);
var newDonator = GetUpdatedDonator(donator2.Id, donator1.Name,100m, donator1.DonateDate);

在上头的代码中,donator1是客户乞请模型的庐山面目目对象,100m是打赏金额的新值。

上面包车型客车点子一级轻易,它只展示了哪些获得具备校正属性值的克隆对象。现实生活中,比超少会看见那般的代码。为了更简洁,大家还是能运用映射模块将世界模型映射到数据模型。

下一步,须要转移改过方法。该更新方法会完成上边更新数据的算法:

  1. 从数据库中研究最新的模型值
  2. 检查原始模型和要更新的模子来寻觅改革属性的列表
  3. 只更新步骤1中寻找到的模型爆发变化的性质
  4. 保存纠正

该算法的代码大约像上边这么些样子:

static void UpdateDonatorEnhanced(Donator originalDonator,Donator newDonator)
{
    using (var db=new Context())
    {
        //从数据库中检索最新的模型
        var donator = db.Donators.Find(originalDonator.Id);
        //接下来检查用户修改的每个属性
        if (originalDonator.Name!=newDonator.Name )
        {
            //将新值更新到数据库
            donator.Name = newDonator.Name;
        }
        if (originalDonator.Amount != newDonator.Amount)
        {
            //将新值更新到数据库
            donator.Amount = newDonator.Amount;
        }
        //这里省略其他属性...
        db.SaveChanges();
    }
}

接下去,使用那五个主意来更新应用程序代码,并检查结果:

 #region 2.0   设计处理字段级别的并发应用
 //1.用户甲读取id=1的打赏者
 var donator1 = GetDonator(1);
 //2.用户乙同样读取id=1的打赏者
 var donator2 = GetDonator(1);
 //3.用户甲通过创建一个新的对象来更新打赏金额为100m
 var newDonator1 = GetUpdatedDonator(donator2.Id, donator1.Name,100m, donator1.DonateDate);
UpdateDonatorEnhanced(donator1,newDonator1);
 //4.用户乙通过创建一个新的对象来更新打赏者姓名为“并发测试”
 var newDonator2 = GetUpdatedDonator(donator2.Id, "并发测试", donator2.Amount, donator2.DonateDate);
 UpdateDonatorEnhanced(donator1, newDonator2);
 #endregion

运转代码此前,先看下数据库中的数据:

操作系统 15

在实行第四步时打个断点,运路程序:

操作系统 16

双重查看数据库中的数据,开掘客户甲的操作已经推行了:

操作系统 17

气势磅礡运路程序,再度翻开数据库的数量,发掘用户乙的操作也执行了:

操作系统 18

从上边的截图来看,多少个客户的央求同叁个实体的更新值都悠久化到数据库中了。由此,假设客商更新分化的字段,该程序能够使得地拍卖并发更新了。然而如果七个客户同偶尔间创新相符的字段,那么这种办法仍旧展现的是终极叁次呼吁的值。即使这种艺术减弱了大器晚成都部队分冒出相关的标题,不过这种格局表示大家必得写一大波代码来拍卖并发难题。前边我们拜会到什么样利用EF提供的体制来拍卖并发难点。

本文由ca88发布,转载请注明来源

关键词: IsPost 字段 快到 取过 代金券