MVC项目的并发处理
先介绍一下背景,做了一个接任务的网站,每次发任务的时候限定有几个人接,所以接任务的时候就需要做并发处理了,不然如果发布人设置10个任务,肯定会出现接了10多个任务的情况。
项目框架:asp.net mvc 5 EF6.0 codefirst fluent api。
数据表设置字段RowVersion,类型timestamp。
在模型中设置:
/// <summary> /// 行标示、并发控制 /// </summary> public byte[] RowVersion { get; set; }
rowversion在数据读取的时候都会读出来,更新的时候会对比读出来的值跟数据库的值是否一致,不一致就可以做并发处理了(乐观并发、悲观并发),更新成功以后rowversion会递增。
Map中配置:
this.Property(x => x.RowVersion).IsRowVersion();
代码:
//如果出现更新的并发冲突,尝试3次 bool retry = false; int retrycount = 0; do { #region 验证-不信任任何输入数据 //注意,每次都要重新读取数据#endregion #region 事务处理 //这里做并发跟事务处理 TransactionOptions transactionOption = new TransactionOptions(); //设置事务隔离级别 transactionOption.IsolationLevel = System.Transactions.IsolationLevel.Serializable; // 设置事务超时时间为60秒 transactionOption.Timeout = new TimeSpan(0, 0, 60); using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, transactionOption)) { try { #region 接任务 #endregion // 没有错误,提交事务 scope.Complete(); retry = false; } catch (Exception ex) { retry = true; retrycount++; if (retrycount > 3) { break; } //throw new Exception("程序异常,原因:" + ex.Message); } finally { //释放资源 scope.Dispose(); } } #endregion } while (retry); if (retry) { TempData["error"] = "接任务失败!该任务已被抢先一步!"; return RedirectToAction("xxxx", "xxxx", new { id = taskid }); }
好了,这样就能解决并发的问题了

浙公网安备 33010602011771号