C++Builder 程序员博客
7 Aug
CREATE PROCEDURE [dbo].[sp_RemoteAddEmployee] @dvcID bigint,@EmpID varchar(10),@Name varchar(10),@Company varchar(50),
@Post varchar(10),@PhoneNum varchar(15),@IdentityCard varchar(20),
@Note varchar(50),@Type tinyint,@FpData1 varbinary(512),
@FpData2 varbinary(512),@FpData4 varbinary(512),@PhotoData image,
@ErrorCode int output,@FpNo int output
AS
DECLARE @strSQL varchar(1024)
DECLARE @FingerNo int
set @FpNo = -1
BEGIN TRAN
–select TOP 20 FpNo = IDENTITY(int,1,1) into #t from syscolumns a
–生成指纹号码
select @FingerNo = CASE WHEN NOT EXISTS(select * from bEmployee_Inf where FingerSn = 1 and dvcID = @dvcID) THEN 1
ELSE
(
select MIN(FingerSn) + 1 from bEmployee_Inf a where NOT EXISTS(select * from bEmployee_Inf where FingerSn = a.FingerSn + 1) and dvcID = @dvcID
)
END
if exists(select ID from bEmployee_Inf where dvcID = @dvcID and IdentityCard = @IdentityCard)
begin
set @ErrorCode = 1
COMMIT TRAN
return
end
–set @index = 1
–Create Table #bFpNo from (select
insert into bEmployee_Inf (dvcID,EmpID,Name,Company,Post,PhoneNum,IdentityCard,Note,Type,FpData1,FpData2,FpData4,PhotoData,FingerSn) values
(@dvcID,@EmpID,@Name,@Company,@Post,@PhoneNum,@IdentityCard,@Note,@Type,@FpData1,@FpData2,@FpData4,@PhotoData,@FingerNo)
if @@ERROR <> 0 or @@ROWCOUNT = 0
begin
set @ErrorCode = 2;
ROLLBACK
return
end
COMMIT TRAN
set @ErrorCode = 0
set @FpNo = @FingerNo
GO
请问一下 这样的存储过程能保证 @FpNo 在同时操作的时候能保证是唯一的吗?就是不会同时产生相同的FpNo.
还有那个IdentitCard 在插入一条新纪录的时候能保证它的唯一性吗?
都不能保证唯一.
最好用字段来限制一下,例如主键设成FingerSn
那要怎样来保证呢?
主要有2种方法:
1. 使用generator,create generator是串行的,可以保证每次生成的ID是唯一的。不过不是所有的DBMS都支持。
2. 使用随机生成的序列号,检测碰撞,如果出现冲突再重新生成一个。
不是事务本身就有加锁的功能吗?
难道可以同时执行同一个事务?
顶一把,问题还是没人来解答啊
数据库本身的功能,比如事务等等,才能实现