注册 登录
编程论坛 SQL Server论坛

在过程中insert一条数据后,取出标识列。在并发情况中的疑问??

changjie 发布于 2007-01-28 16:21, 868 次点击

create procedure addArticle_type
as
insert into slave_article_type (T_title,T_admin,T_picPath,T_width,T_height) --添加
values ('网络技术','changjie',default,default,default)
select scope_identity() --查了下网上的话法,给出的解释是在 (任何会话当前作用域所有表)


比如有这样一个过程,在我insert一条数据后,然后马上取出这个标识。

假如有很多用户添加数据, 在我自己的会话中,还没有把这个标识列取出, 又被另外一个用户更改了这个标识列。

我要怎么才能保证这个标识列是我自己的呢??

或者说我现在的这种理解完全走入了误区。 还请高手指点。

9 回复
#2
棉花糖ONE2007-01-28 16:50

把select和insert语句放在一个事务中

#3
bygg2007-01-28 21:53
加锁,,可以不??
#4
棉花糖ONE2007-01-28 21:59
改天来个事务,锁,以及并发性的讨论
#5
bygg2007-01-28 22:28
以下是引用jinyuzhang在2007-1-28 21:59:00的发言:
改天来个事务,锁,以及并发性的讨论

赞成..多多指教.

#6
changjie2007-01-28 22:38

强列支持版主来个,事务,锁, 的讨论。

版主所说的放在事务中,我也想过,但是总觉的还是不妥。
事务保证当前的这个批处理的完整性。 而这里取scope_identity() 是(所有会话所有表当前作用域--其实这句话也是看的一知半解) 的最后的一个identity
但这个事务中,也不能保证,其他用户添加记录啊而改变最后的identity啊。

对于并发问题,不明白的还真多,但这恰恰又是个重点, 还多请前辈们多多指教。

#7
棉花糖ONE2007-01-28 22:59

不是我讨论,我是要你们讨论,我也是菜菜

#8
棉花糖ONE2007-01-28 23:36

找到一种方案,在insert的时候加表级锁,可以防止别人插入,但是这个代价也太大了,其他用户连select都无法执行了,这个太不实际了
begin tran
insert into slave_article_type with(tablock) (T_title,T_admin,T_picPath,T_width,T_height) --添加
values ('网络技术','changjie',default,default,default)
select scope_identity()
commit tran

#9
bygg2007-01-29 13:02
加了锁后,只能是在一个用户用完以后,下一个用户才可以用.
一定要记住,加了锁,要解锁.
#10
棉花糖ONE2007-01-29 13:05
可以直接在语句中加锁,事务完成后就释放了

[此贴子已经被作者于2007-1-29 13:06:07编辑过]


1