高并发,流水号重复问题。。

挨踢蜗牛 2016-04-29 11:16:37
declare @A2 varchar(50)
--获取最大流水号
select @A2=MAX(A2) from TB_Order
if(@A2 is null)
begin
set @A2=100000
end
set @A2=@A2+1

while exists (select * from TB_Order where A2=@A2)
begin
set @A2=@A2+1
end
--新增
insert into TB_Order (A2)values(@A2)

这个多人并发,会有出现流水号重复的概率。。。怎么解决?用锁?
...全文
1208 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
比较低效的方式,是在数据库中建立一个“流水号”的表,里边只有一个字段、一条记录,就是流水编号的值。那么当一个数据库“事务”去读且+1这个值时,它默认地是读写锁的保护级别。注意,不要随便在事务中造成什么“TB_Order表”锁了,因为有大量的查询任务就是简单地查询,并不应该被hang住。 当然,假设你有多个表都有这个机制,那么你可以为这个表再增加一个主键字段——表名。 比较高效率的方式,是使得进程中各个页面处理线程可以瞬间互斥地进行+1操作就行了。例如
private static int x; //在类型初始化时,从数据库中查询一次 max(流水号) 并赋值给x 变量
private static object xflag= new object();

priate void test()
{
    .........
    int y;
    lock(xflag)
    {
        x++;
        y = x;
    }
    ........
    //这里进行其它业务操作
线程互斥的管理区域,只是简单地两个语句,非常快,非常短,肯定比数据库方案快1万倍。
zbdzjx 2016-04-29
  • 打赏
  • 举报
回复
锁表,一段时间内,只允许一个用户进行操作,将并行变成串行。
showwe 2016-04-29
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
比较低效的方式,是在数据库中建立一个“流水号”的表,里边只有一个字段、一条记录,就是流水编号的值。那么当一个数据库“事务”去读且+1这个值时,它默认地是读写锁的保护级别。注意,不要随便在事务中造成什么“TB_Order表”锁了,因为有大量的查询任务就是简单地查询,并不应该被hang住。 当然,假设你有多个表都有这个机制,那么你可以为这个表再增加一个主键字段——表名。 比较高效率的方式,是使得进程中各个页面处理线程可以瞬间互斥地进行+1操作就行了。例如
private static int x; //在类型初始化时,从数据库中查询一次 max(流水号) 并赋值给x 变量
private static object xflag= new object();

priate void test()
{
    .........
    int y;
    lock(xflag)
    {
        x++;
        y = x;
    }
    ........
    //这里进行其它业务操作
线程互斥的管理区域,只是简单地两个语句,非常快,非常短,肯定比数据库方案快1万倍。

62,046

社区成员

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

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

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

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