叫号系统重号问题

rax_ken 2013-08-20 05:08:01
因业务需要,派号时有多台机器在派号,因此自己测试,打开两台机器然后两只手各拿一个鼠标猛点派号,结果派出的号码有重复,求高手帮忙
实现派号的主要代码:

string sql = string.Format("select decode( max(p_num),null,0,max(p_num))+1 p_num from T_PAIHAO where P_DATA = '{2}' and to_char(createdtime,'yyyymmdd')=to_char(sysdate,'yyyymmdd') and P_QYID= '{0}' and P_YWLX= '{1}'", qyID, ywlxID, sj);
string maxNum = crjService.GetDataByTable(sql).Tables[0].Rows[0][0].ToString();
string sqlInsert = string.Format("insert into t_paihao (P_NUM,P_QYID,P_SFZ,P_YWLX,P_PHRQ,P_DNIP,P_DATA)values('{0}','{1}','{2}','{3}','{4}','{5}','{6}')",maxNum,qyID,sfzhm,ywlxID,timeNow,ipAdd,sj);
int result = crjService.ExecuteNonQuery(sqlInsert);
...全文
483 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
qldsrx 2013-08-22
  • 打赏
  • 举报
回复
引用 13 楼 rax_ken 的回复:
谢谢各位的回复,最后自己解决了。将两条SQL语句合成一条SQL语句执行,问题就解决了!
就是这么回事,合在一起的时候,Oracle会自动添加事务的,而Sqlserver则是可以使用外部变量在插入时记录插入值,都可以实现。
e251396 2013-08-22
  • 打赏
  • 举报
回复
引用 29 楼 yuwenge 的回复:
[quote=引用 28 楼 e251396 的回复:] [quote=引用 26 楼 yuwenge 的回复:] [quote=引用 24 楼 e251396 的回复:] 不知道程序是b/s还是c/s的,如果是b/s的话,可以在页面使用lock来实现,这样差不多就可以了。 如果是c/s的话,同时连接的数据库是单独的,那还是通过存储过程在数据库进行锁记录,返回的时候释放锁就行了。
我很想知道你的页面Lock是什么。[/quote] 在页面代码中使用lock,这样下一个请求必须等到释放锁了才能进入代码。[/quote] 靠,我还以为是js能lock呢。你这写在服务端的代码跟页面有什么关系啊。[/quote] FK,服务端分两种,一个是web服务器端,一个是数据库服务器端,如果你 web程序和db 在同一个台服务器,那就在服务端控制好了,我要说的是就是意思,没有哪个SB会说在js端(客户端)控制。
卧_槽 2013-08-22
  • 打赏
  • 举报
回复
引用 28 楼 e251396 的回复:
[quote=引用 26 楼 yuwenge 的回复:] [quote=引用 24 楼 e251396 的回复:] 不知道程序是b/s还是c/s的,如果是b/s的话,可以在页面使用lock来实现,这样差不多就可以了。 如果是c/s的话,同时连接的数据库是单独的,那还是通过存储过程在数据库进行锁记录,返回的时候释放锁就行了。
我很想知道你的页面Lock是什么。[/quote] 在页面代码中使用lock,这样下一个请求必须等到释放锁了才能进入代码。[/quote] 靠,我还以为是js能lock呢。你这写在服务端的代码跟页面有什么关系啊。
e251396 2013-08-22
  • 打赏
  • 举报
回复
引用 26 楼 yuwenge 的回复:
[quote=引用 24 楼 e251396 的回复:] 不知道程序是b/s还是c/s的,如果是b/s的话,可以在页面使用lock来实现,这样差不多就可以了。 如果是c/s的话,同时连接的数据库是单独的,那还是通过存储过程在数据库进行锁记录,返回的时候释放锁就行了。
我很想知道你的页面Lock是什么。[/quote] 在页面代码中使用lock,这样下一个请求必须等到释放锁了才能进入代码。
djnick 2013-08-21
  • 打赏
  • 举报
回复
不用自增列的话 我想到的是 新建模块 锁机制 另外 你的程序不会很多地方都是拼凑sql的吧?这样会很浪费计划缓存的 建议改成存储过程或参数化
feiniao19830822 2013-08-21
  • 打赏
  • 举报
回复
数据库加锁是正道。
tcmakebest 2013-08-21
  • 打赏
  • 举报
回复
最好的办法当然是用数据库自身的自动编号功能,如果每天要从1号开始,那就取【自动编号-当天最小编号+1】。
lyx266 2013-08-21
  • 打赏
  • 举报
回复
引用 13 楼 rax_ken 的回复:
谢谢各位的回复,最后自己解决了。将两条SQL语句合成一条SQL语句执行,问题就解决了!
你两条语句并成一条后 只能说出错的概率会变小很多..但是从逻辑上看还是有会出现重号,我觉得你用单例模式来取号比较好
PaulyJiang 2013-08-21
  • 打赏
  • 举报
回复
引用 13 楼 rax_ken 的回复:
谢谢各位的回复,最后自己解决了。将两条SQL语句合成一条SQL语句执行,问题就解决了!
两条合成一条解决不了根本问题
PaulyJiang 2013-08-21
  • 打赏
  • 举报
回复
写一个SP直接返回的吧,然后用事务去管控
rax_ken 2013-08-21
  • 打赏
  • 举报
回复
谢谢各位的回复,最后自己解决了。将两条SQL语句合成一条SQL语句执行,问题就解决了!
maysoft 2013-08-21
  • 打赏
  • 举报
回复
我的办法是放在服务里内存里..关键调用都检查是否被占用
卧_槽 2013-08-21
  • 打赏
  • 举报
回复
引用 24 楼 e251396 的回复:
不知道程序是b/s还是c/s的,如果是b/s的话,可以在页面使用lock来实现,这样差不多就可以了。 如果是c/s的话,同时连接的数据库是单独的,那还是通过存储过程在数据库进行锁记录,返回的时候释放锁就行了。
我很想知道你的页面Lock是什么。
e251396 2013-08-21
  • 打赏
  • 举报
回复
上面说错了,应该是: 同时连接的数据库是同一个库
e251396 2013-08-21
  • 打赏
  • 举报
回复
不知道程序是b/s还是c/s的,如果是b/s的话,可以在页面使用lock来实现,这样差不多就可以了。 如果是c/s的话,同时连接的数据库是单独的,那还是通过存储过程在数据库进行锁记录,返回的时候释放锁就行了。
meskin0556 2013-08-21
  • 打赏
  • 举报
回复
用一个ID代表每台机器 然后再根据机器ID生成数据库key
forwin 2013-08-21
  • 打赏
  • 举报
回复
可以用事务来处理
OopsJeff 2013-08-21
  • 打赏
  • 举报
回复
加锁来,获取成功后,才放锁
devmiao 2013-08-20
  • 打赏
  • 举报
回复
对数据库表加锁
by_封爱 版主 2013-08-20
  • 打赏
  • 举报
回复

id int identity(1,1) primary key
or

id varchar(100) not null
insert into xxoo values(newid())
以上代码应该不重复了
加载更多回复(10)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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