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 });
            }    

好了,这样就能解决并发的问题了

posted @ 2015-09-22 11:28  Charisma.  阅读(576)  评论(0)    收藏  举报