[HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult> Edit(int? id, byte[] rowVersion) { string[] fieldsToBind = new string[] { "Name", "Budget", "StartDate", "InstructorID", "RowVersion" }; if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } var departmentToUpdate = await db.Departments.FindAsync(id); if (departmentToUpdate == null) { Department deletedDepartment = new Department(); TryUpdateModel(deletedDepartment, fieldsToBind); ModelState.AddModelError(string.Empty, "Unable to save changes, the department was deleted by another user"); ViewBag.InstructorID = new SelectList(db.Instructors, "ID", "FullName", deletedDepartment.InstructorID); return View(deletedDepartment); } if (TryUpdateModel(departmentToUpdate, fieldsToBind)) { try { db.Entry(departmentToUpdate).OriginalValues["RowVersion"] = rowVersion; await db.SaveChangesAsync(); return RedirectToAction("Index"); } catch (DbUpdateConcurrencyException ex) { var entry = ex.Entries.Single(); var clientValues = (Department)entry.Entity; var databaseEntry = entry.GetDatabaseValues(); if (databaseEntry == null) { ModelState.AddModelError(string.Empty, "无法保持更改,系已被其他用户删除"); } else { var databaseValues = (Department)databaseEntry.ToObject(); if (databaseValues.Name != clientValues.Name) { ModelState.AddModelError("Name", "当前值:" + databaseValues.Name); } if (databaseValues.Budget != clientValues.Budget) { ModelState.AddModelError("Budget", "当前值:" + databaseValues.Budget); } if (databaseValues.StartDate != clientValues.StartDate) { ModelState.AddModelError("StartDate", "当前值:" + databaseValues.StartDate); } if (databaseValues.InstructorID != clientValues.InstructorID) { ModelState.AddModelError("InstructorID", "当前值:" + db.Instructors.Find(databaseValues.InstructorID).FullName); } ModelState.AddModelError(string.Empty, "当前记录已经被其他人更改,如果你仍要保存这些数据,重新点击保持按钮或点击返回列表撤销本次操作"); departmentToUpdate.RowVersion = databaseValues.RowVersion; } } catch (RetryLimitExceededException) { ModelState.AddModelError(string.Empty, "无法保持更改"); } } ViewBag.InstructorID = new SelectList(db.Instructors, "ID", "FullName", departmentToUpdate.InstructorID); return View(departmentToUpdate); }
相关推荐
论文研究-网络交通分布式模拟乐观同步算法研究.pdf, 基于分布式网络环境,运用并行模拟领域的最新研究成果,对路网交通流分面式并行模拟中如何实现处理内部的时钟同步...
眉毛图像的分割,由于受到毛发、姿势及个体差异的影响,是一个非常困难的问题。提出了一种利用半监督学习技术进行彩色眉毛图像分割的方法,首先通过手工在眉毛图像上简单画上几条线标注部分眉毛点和非眉毛点,然后...
GPUTW:基于GPU的离散事件模拟引擎,支持保守和乐观同步,可逆随机数生成和参数自动调整。 发布:https:dl.acm.orgdoi10.11453064911.3064912
剖析了POSE框架中的乐观同步策略,按照时间窗口调整状况将其自适应策略分为半自适应策略和完全自适应策略;对自适应乐观同步策略的模拟速度与精度进行了深入的测试比较,发现经过调整半自适应乐观策略能够取得更好的...
该示例提供了客户端和服务器端示例。服务器端使用node进行开发,客户端使用js开发,在web页面进行演示。可迁移至cocos creator等游戏项目。
&乐观同步Backbone.sync和&符同步的包装器,通过HTTP实现乐观并发。 不确定什么是乐观并发? 如何使用?默认行为对于默认行为,只需像这样扩展: var Model = require ( 'ampersand-model' ) ; // or require('...
2015七年级政治下册 第1单元 第3课《乐观向上》同步练习2 北师大版
2015七年级政治下册 第1单元 第3课《乐观向上》同步练习4 北师大版
2015七年级政治下册 第1单元 第3课《乐观向上》同步练习1 北师大版
2015七年级政治下册 第1单元 第3课《乐观向上》同步练习3 北师大版
并行分布仿真对复杂大规模动态系统的研究以及探索,对长远的应用提供...在分别论述四类基本的时间推进同步机制,即保守机制、乐观机制、混合机制和自适应机制的同时,还分析了各自的优缺点,指出了今后的研究发展方向。
轻量级锁 “轻量级”是相对于使用操作系统互斥量来实现的传统锁而言的。但是,首先需要强调一点的是, ...景是线程交替执行同步块的情况,如果存在同一时间访问同一锁的情况,就会导致轻量级锁膨胀 为重量级锁。
在现有仿真时间推进机制中,事件的发生时间采用精确的时间戳,但是有时事件的发生时间用一个时间区间来表达更合理。该文提供了一种新的时间...在RTI上增加时间管理扩展组件,用来实现基于时间区间的乐观时间同步机制。
高并发是搞j2ee颇为关心的问题。...采用乐观锁控制oracle数据并发访问。测试结果表明在 c3p0 和dbcp 都能执行完4800以下并发线程访问。c3p0 比较流畅点, tomcatjdbc 就4000 并发线程都有问题了(结果仅供参考)
synchronized同步锁(悲观锁)2.1 synchronized 作用范围2.2 synchronized 核心组件2.3 synchronized 实现 1. Java锁的种类 1.1 乐观锁 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低。 每次去拿...
乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低(不是没有, 所以还要加锁, 区别于不加锁的乐观读),每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有...
磁极 :glowing_star: 与框架无关的同步解决方案,可自动将任何DB / API与本地数据存储连接,并内置有乐观UI。 npm i magnetar认识家人 :glowing_star: 通过自动同步到远程数据库和服务,可以完成状态管理。 内置与...
主要介绍了Java并发编程之原子变量与非阻塞同步机制,本文讲解了非阻塞算法、悲观技术、乐观技术、CAS操作、原子变量、性能比较:锁与原子变量等内容,需要的朋友可以参考下
时间偏差是并行离散事件模拟中广泛使用的一种同步机制。从事件列表管理、消息取消、乐观性控制、状态保存和恢复、内存管理以及全局虚拟时间计算等几个主要方面对时间偏差的并行离散事件模拟进行了探讨,阐述了其存在...