请教:向表INSERT记录过程中怎样防止其他用户也INSERT?

hellowork 2006-05-29 10:42:02
需求:
并发情况下,当A用户向含有IDENTITY列的表中插入记录时,需要获得A用户所插入的新记录IDENTITY列的起始值和截止值,然后以起始值和截止值范围来作为筛选条件,来查询下载A用户新插入的这些记录(如:起始值<=IDENTITY列<=截止值)。因此必须保证起始值和截止值之间完全是A用户的INSERT操作产生的,不能有其他用户INSERT操作生成的。
例如:ID列为IDENTITY列,A用户INSERT之前ID最大值为10,若A用户插入结束后ID最大值为20,则必须保证 10< ID <=20 范围内的新记录都是由A用户生成的,不能存在由其他用户插入而产生的ID值。
...全文
194 5 打赏 收藏 举报
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
liangpei2008 2006-05-29
学习
  • 打赏
  • 举报
回复
hellowork 2006-05-29
多谢龙哥哥和邹建的指教!
邹建所说的“SET TRANSACTION ISOLATION LEVEL SERIALIZABLE”是关键。
综合二位的指点,实现如下:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
INSERT ....
SELECT ...
IF @@error > 0
ROLLBACK
ELSE
COMMIT TRAN
SET TRANSACTION ISOLATION LEVEL READ COMMITTED /* 恢复默认隔离级别,否则其他用户连SELECT都无法操作,一直处于等待中*/


请指正!
  • 打赏
  • 举报
回复
dutguoyi 2006-05-29
学习
  • 打赏
  • 举报
回复
zjcxc 元老 2006-05-29
-- 将事务隔离级别提高到SERIALIZABLE, 这样, 你可以在事务中做插入和SELECT处理, 在事务没有提交前, 别人必须等待你的处理完成才能做插入

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
INSERT ....
SELECT ...
COMMIT TRAN
  • 打赏
  • 举报
回复
CnEve 2006-05-29
用事务呀
Begin TRAN
insert into .........
if @@Error = 0
Commit TRAN --提交事务
else
Rollback TRAN --回滚

GO
  • 打赏
  • 举报
回复
相关推荐
发帖
MS-SQL Server

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
帖子事件
创建了帖子
2006-05-29 10:42
社区公告
暂无公告