请教:向表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值。
...全文
251 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
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都无法操作,一直处于等待中*/


请指正!
新鲜鱼排 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

34,837

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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