27,579
社区成员
发帖
与我相关
我的任务
分享
---------------------------------------第一部分--------------------------------------------------------------
begin tran
select * from [dbo].[a] with (tablockx); --锁表,不想让其他的事务读取表里的任何数据
if exists(select 1 from [dbo].[a] where 条件) --根据产品代码判断是否存在相关记录
begin
select maxid from [dbo].[a] where 条件; --根据产品代码取出id
if(截取id <> 当前年份)
begin
根据年份重新生成NewId --这里的NewID会被第二部分使用
end
将NewId+1更新表a字段maxid
end
else --如果产品不存在记录
begin
根据当前年份生成NewID
将NewID+1插入表a,生成新的记录
end
--------------------------------------------第二部分-----------------------------------------------------
while 条件
begin
根据NewID生成多条记录插入另外一个表B
end
commit
begin tran
update [dbo].[a] set maxid = maxid where 条件 -- 只需要锁定相关的一条记录
if (@@ROWCOUNT<>0) -- 有更新就表示存在相关记录
begin
-- 可以考虑改成这样的,不用加锁
create table test(id int, name varchar(10))
go
insert into test values((select isnull(max(id),0) + 1 from test) , 'XXX')
insert into test values((select isnull(max(id),1) + 1 from test) , 'YYY')
go
select * from test
go
drop table test
go
(1 行受影响)
(1 行受影响)
id name
----------- ----------
1 XXX
2 YYY
(2 行受影响)
insert into test values((select isnull(max(id),0) + 1 from test) , 'XXX')
insert into test values((select isnull(max(id),1) + 1 from test) , 'YYY')