如何保证并发时的编号不重复

叫我 Teacher 周 2014-09-01 11:43:12
有一个编号字段,不是自增的

做一个注册的功能,在程序里给这个编号自动+1

程序的思路是,先查出上一个的最小值,+1,然后存回去

那,如何保证在并发时,编号不会重复
...全文
800 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
叫我 Teacher 周 2014-09-01
  • 打赏
  • 举报
回复
引用 1 楼 jhdxhj 的回复:
直接在数据库的表中设置自动增长就可以了
不符合需求啊,这个编号是每个城市不一样,北京有1号,上海也有1号
by_封爱 2014-09-01
  • 打赏
  • 举报
回复
GUID......
threenewbee 2014-09-01
  • 打赏
  • 举报
回复
用事务锁表,事务的本质就是在一个事务内部,是串行的而无法并发,这就杜绝了重复的可能。
bdmh 2014-09-01
  • 打赏
  • 举报
回复
1.自增字段 2.保存时再生成编号(不能绝对解决问题) 3.通过业务规则,来生成惟一的编号 4.锁机制
jhdxhj 2014-09-01
  • 打赏
  • 举报
回复
直接在数据库的表中设置自动增长就可以了
我不懂电脑 2014-09-01
  • 打赏
  • 举报
回复
使用事务操作 SqlConnection con = new SqlConnection(ConnectionDb.conStr);//获取数据库连接 con.Open();//打开连接 SqlTransaction sqltra = con.BeginTransaction();//开始事务 SqlCommand cmd = new SqlCommand();//实例化 cmd.Connection = con;//获取数据连接 cmd.Transaction = sqltra;//,在执行SQL时, try { string sql = "insert into OA_MEETING(meeting_id,meeting_name,meeting_title,start_time,end_time,announce_time,explain,reg_emp_id,emc_emp_id,par_emp_id,rep_emp_id,participate,MEETING_TYPE,PROJ_ID,WORK_ID)values('" + id + "',N'" + meetname + "',N'" + meettitle + "','" + starttime + "','" + endtime + "',N'" + djtime + "',N'" + meetinfo + "','" + empid + "','" + meetperson + "','" + lname + "','" + writer + "','" + ccname + "','" + hidsort.Value + "','" + proid + "','" + workid + "')"; cmd.CommandText = sql; cmd.ExecuteNonQuery(); //string meetid = id; int size = 0; HttpFileCollection files = HttpContext.Current.Request.Files; //遍历上传文件窗体所有Html控件 foreach (string NameId in Request.Form) { //找到控件ID名前四位为"txt_"的文件说明文本框 if (NameId.Substring(0, 4) == "ttx_") { //获取文本说明 if (Request.Form[NameId] != "") { string Explain = Request.Form[NameId];//获取txt文本说明 HttpPostedFile pstfile = files["fil_" + NameId.Substring(4)]; string fileName = ""; string fileExtension = ""; fileName = System.IO.Path.GetFileName(pstfile.FileName);//上传的文件全名 fileExtension = System.IO.Path.GetExtension(fileName);//扩展名 string NewName = fileName.Remove(fileName.LastIndexOf("."));//去掉后缀名的文件名 string sql1 = "select isnull(max(app_id),0) from OA_MEETING_APPENDIX"; int idd = Convert.ToInt32(objConnction.getString(sql1)) + 1; ua.Folder_Exists("Meeting"); string filepath = "..\\AtthFiles\\Meeting\\Meeting_" + idd.ToString() + fileExtension; string sqlstr1 = "insert into OA_MEETING_APPENDIX(APP_ID,MEETING_ID,EXPLAIN,APP_PATH) values('" + idd + "','" + id + "',N'" + Explain + "',N'" + filepath + "')"; cmd.CommandText = sqlstr1; int num = cmd.ExecuteNonQuery(); if (num > 0) { pstfile.SaveAs(Server.MapPath("..\\AtthFiles\\Meeting\\Meeting_" + idd.ToString() + fileExtension)); size = pstfile.ContentLength / 1024; objDocument.InsertDoc(5, idd, Explain, "", "", DateTime.Now.ToString("yyyy-MM-dd"), Convert.ToInt32(HempID.Value), filepath, size, hidwork.Value, hidpro.Value); } } } } sqltra.Commit(); }catch(Exception ex) { sqltra.Rollback(); }
叫我 Teacher 周 2014-09-01
  • 打赏
  • 举报
回复
引用 6 楼 OExpress 的回复:
GUID或者MD5值,绝对不会重复,或者使用srand生成随机值,但是要加一就不能实现了
不能加密,因为这个编号要导出来的。你是1号,就是1号,他是2号,就是2号
叫我 Teacher 周 2014-09-01
  • 打赏
  • 举报
回复
引用 8 楼 a407121393 的回复:
新建一个存最大编号的表,先update编号=编号+1,然后再取出来,update是原子操作可以保证你的并发
什么叫原子操作??
叫我 Teacher 周 2014-09-01
  • 打赏
  • 举报
回复
引用 7 楼 Z65443344 的回复:
[quote=引用 5 楼 playermaker 的回复:] [quote=引用 1 楼 jhdxhj 的回复:] 直接在数据库的表中设置自动增长就可以了
不符合需求啊,这个编号是每个城市不一样,北京有1号,上海也有1号[/quote] 没有不行么,为什么都非要从1号开始? 那如果我注册了1号,又不要了,怎么办,不是一样,还是没有1号了么[/quote] 不要就不要了,这个是需求,反正就是要每条记录自增上去就对了,但不是自增列。怕的就是并发时的提交
饕餮123 2014-09-01
  • 打赏
  • 举报
回复
新建一个存最大编号的表,先update编号=编号+1,然后再取出来,update是原子操作可以保证你的并发
於黾 2014-09-01
  • 打赏
  • 举报
回复
引用 5 楼 playermaker 的回复:
[quote=引用 1 楼 jhdxhj 的回复:] 直接在数据库的表中设置自动增长就可以了
不符合需求啊,这个编号是每个城市不一样,北京有1号,上海也有1号[/quote] 没有不行么,为什么都非要从1号开始? 那如果我注册了1号,又不要了,怎么办,不是一样,还是没有1号了么
CyberLogix 2014-09-01
  • 打赏
  • 举报
回复
GUID或者MD5值,绝对不会重复,或者使用srand生成随机值,但是要加一就不能实现了

62,040

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧