社区
MS-SQL Server
帖子详情
在多线程环境怎么以MAX id 产生一个唯一值?
phiger
2003-12-23 02:37:53
问题是这样的,我有一个存储过程插入一条记录,通过@@ROWCOUNT取当前id值,但问题是多线程,可能同时别的线程也插入一条记录,取当前id值就变成另一条记录的id值了,请问那位高手有什么办法解决,谢谢!!
...全文
97
14
打赏
收藏
在多线程环境怎么以MAX id 产生一个唯一值?
问题是这样的,我有一个存储过程插入一条记录,通过@@ROWCOUNT取当前id值,但问题是多线程,可能同时别的线程也插入一条记录,取当前id值就变成另一条记录的id值了,请问那位高手有什么办法解决,谢谢!!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
14 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
zjcxc
元老
2003-12-23
打赏
举报
回复
如果用max(id)来取,就难说了.
zjcxc
元老
2003-12-23
打赏
举报
回复
如果是用@@identity取identity字段值,肯定不会出现重复.
因为@@identity总是返回最后一次的identity值,而SQL处理插入数据,不可能出来并发的情况.
Rotaxe
2003-12-23
打赏
举报
回复
可以用SCOPE_IDENTITY
返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值。
j9988
2003-12-23
打赏
举报
回复
缺省值用IDENTITY生成.绝对不会并发.其它方法并发的可能性都是有的.
j9988
2003-12-23
打赏
举报
回复
我觉得:
你即然有IDEBTITY列.且又是根据IDEBTITY值生成CODE.
就对代码列用DEFAULT约束.然后,不对它插入值.
或:
insert table(CODE,.......) values(default,......)
让系统自动生成.
就不用担心并发了.
gmlxf
2003-12-23
打赏
举报
回复
放心,不会出现并发现象。
phiger
2003-12-23
打赏
举报
回复
CREATE PROCEDURE Insert_Log
...
AS
insert into log(price) valuesprice)
select @Trans_Id= @@identity
if @Trans_Id is not null
return @Trans_Id
else
return -1
GO
这样我是能正确插入数据,但得到的Trans_Id在多线程环境下会不会可能是别的线程调用存储过程插入的,会不会别的线程也刚好执行到insert into log(price) valuesprice)这句,望高手能不能解释清楚一下,谢谢!!
qiaolin53
2003-12-23
打赏
举报
回复
在每次插入数据前用select max(id)+1 from 表
获得最大id。
liuyun2003
2003-12-23
打赏
举报
回复
呵呵~~~马可说的很详细啊。
phiger
2003-12-23
打赏
举报
回复
以前我就是在存储过程中插入语句后SELECT @@IDENTITY,但我的应用程序是多线程的,可能多个线程同时调用这个存储过程,结果发现存储过程返回值有些是重复的!
gmlxf
2003-12-23
打赏
举报
回复
declare @id int
insert t ...
select @id=@@identity
phiger
2003-12-23
打赏
举报
回复
谢谢,那假如我写一个存储过程,这个存储过程功能就是插入一条记录,并取出pono或id作为返回值应该怎么写呢?因为我在存储过程中插入一条纪录后,用@@ROWCOUNT或@@IDENTITY来取的,但此时可能别的线程同样插入了一条记录,这时@@ROWCOUNT或@@IDENTITY可能就不对了!
gmlxf
2003-12-23
打赏
举报
回复
如果你的id是identity,那么可以用
select @@identity获得,不会并发。
txlicenhe
2003-12-23
打赏
举报
回复
问题:在实际业务处理中有些单号需要自动增长,但又不能用自增列代替
eg: P031106001 -- 第一位P表示采购单,031106表示日期,后三位是流水号。
/* 1:创建测试用的表结构 */
create table tablename(pono char(10),b int)
go
/* 2:创建一个得到当前日期的视图,为下面的自字义函数作准备 */
create view vGetdate
as
select getdate() as today
go
/* 3:用自定义函数来得到单号(因自定函数内不能用getdate()来得到当前日期,要用到上面的视图) */
create function getDH()
returns char(10)
As
begin
declare @dh1 char(10),@dh2 char(10)
select @dh1 = max(pono) from tableName
Set @dh1 = IsNull(@dh1,'P000000000')
select @dh2 = Left(@dh1,1) + right(convert(varchar(8),today,112),6) + '001' from vGetdate
if @dh1 >= @dh2
begin
set @dh2 = left(@dh1,7) + right('000'+ cast(cast(right(@dh1,3) as int)+1 as varchar),3)
end
return(@dh2)
end
go
/* 4:在字段默认值中填入 dbo.getdh() */
alter table tablename add constraint df_tablename_1 default(dbo.getdh()) for pono
-/* 5:测试:*/
insert tablename(b) values(1)
insert tablename(b) values(2)
Select * from tablename
-- 测试结果
pono b
---------- -----------
P031115001 1
P031115002 2
总结:此方法运用到了一些小技巧
1:用字段默认值来实现单号自增
2:用自定义函数来得到字段的默认值
3:因在自定义函数中不能用getdate()之类非确定的函数,用视图来得到当前日期
QT
多线程
编程详解
一、线程基础 1、GUI线程与工作线程 每个程序启动后拥有的第
一个
线程称为主线程,即GUI线程。QT中所有的组件类和几个相关的类只能工作在GUI线程,不能工作在次线程,次线程即工作线程,主要负责处理GUI线程卸下的工作。 2、数据的同步访问 每个线程都有自己的栈,因此每个线程都要自己的调用历史和本地变量。线程共享相同的地址空间。 二、QT
多线程
简介 QT通过三种形式提供了对线程...
模拟实现
一个
多线程
环境
引言 初学者或者一些有经验的开发人员,并不总是对于系统底层有清楚的了解。比如,进程(或线程)调度是如何实现的?往往只停留于模糊的认识。了解这些问题的最好途径是亲自实践。然而开发
一个
真实系统的门槛很高,而通过学习
一个
已有系统来了解也非易事,因为错综复杂的代码和关系有时把人搞糊涂了。于是学习者往往写一些模拟程序来努力表达系统是怎样运作的。不过,这些程序往往过于简单。于是“看看能否写
一个
模拟进程调度的
C#
多线程
详解
上下文切换(Context Switching)是
多线程
环境
中的一种操作,指的是在
一个
CPU 核心上切换正在执行的线程,从当前线程的执行上下文(包括寄存器状态、程序计数器等)切换到另
一个
线程的执行上下文, 线程的切换需要额外的开销,因此在某些情况下,过多的线程可能会导致性能下降。因此,在设计
多线程
应用程序时,需要考虑如何减少上下文切换的发生,以提高程序的执行效率。是用于实现线程同步的一种机制,用于保护共享资源,避免竞态条件。上下文切换开销指的是从
一个
线程切换到另
一个
线程的过程中所涉及的时间和资源开销。
Java
多线程
并发编程
一、
多线程
1、操作系统有两个容易混淆的概念,进程和线程。 进程:
一个
计算机程序的运行实例,包含了需要执行的指令;有自己的独立地址空间,包含程序内容和数据;不同进程的地址空间是互相隔离的;进程拥有各种资源和状态信息,包括打开的文件、子进程和信号处理。 线程:表示程序的执行流程,是CPU调度执行的基本单位;线程有自己的程序计数器、寄存器、堆栈和帧。同一进程中的线程共用相同的地址空间,同时共享进
明明加了
唯一
索引,为什么还是
产生
重复数据?
前段时间我踩过
一个
坑:在mysql8的一张innodb引擎的表中,加了
唯一
索引,但最后发现数据竟然还是重复了。到底怎么回事呢?本文通过一次踩坑经历,聊聊
唯一
索引,一些有意思的知识点。
MS-SQL Server
34,837
社区成员
254,632
社区内容
发帖
与我相关
我的任务
MS-SQL Server
MS-SQL Server相关内容讨论专区
复制链接
扫一扫
分享
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章