--存储过程如下:
IF EXISTS(SELECT name FROM sysobjects
WHERE name='TestTran' AND type='U')
DROP TABLE TestTran
IF EXISTS(SELECT name FROM sysobjects
WHERE name='procTestTran' AND type='P')
DROP PROCEDURE procTestTran
GOCREATE TABLE TestTran
(
[AutoID] [int] PRIMARY KEY IDENTITY (1, 1) NOT NULL ,
[UserName] varchar(50) NOT NULL
)
GO--存储过程
CREATE PROCEDURE procTestTran
@isCommit int
AS
BEGIN
DECLARE
@a varchar(50),
@TmpWhile int,
@StartMaxID int,
@EndMaxID int
--返回AutoID的最大值给 @StartMaxID
SET @StartMaxID =(SELECT MAX(AutoID) FROM TestTran) --开始事务
BEGIN TRANSACTION
IF @StartMaxID IS NULL SET @StartMaxID = 0
SET @TmpWhile=1
--用一个循环插入5条记录
WHILE @TmpWhile<=5 BEGIN
INSERT INTO TestTran(UserName) VALUES('testname')
SET @TmpWhile=@TmpWhile+1
END
SET @EndMaxID=(SELECT MAX(AutoID) FROM TestTran)
IF @isCommit=1 BEGIN --提交事务的条件
COMMIT TRANSACTION
END ELSE BEGIN
ROLLBACK TRANSACTION
END
PRINT @EndMaxID-@StartMaxID
PRINT CONVERT(varchar(10),@StartMaxID ) + ' | ' + CONVERT(varchar(10),@EndMaxID)
END
GOEXECUTE procTestTran 1
EXECUTE procTestTran 0
EXECUTE procTestTran 0
EXECUTE procTestTran 1/*
我想要的结果就是@EndMaxID-@StartMaxID始终=5
如果 存储过程的参数 <> 1
那么最后AutoID就不是连续的了,那么结果有的也就不是全=5有什么办法可以让ROLLBACK后AutoID不产生断开现象偶对事务不十分熟悉~感觉好象是:
这个事务好像是先把数据写入了表中,如果发现提交条件不成立则执行ROLLBACK,从表中删除这些记录
能不能让事务预先不写入表中,在内存中执行,如果发现条件成立则写入表中,不成立则不写入表中
这样就不会产生标识列断开的现象~!但是用其他程序如:ASP等写的事务就不会产生AutoID断开现象
*/
IF EXISTS(SELECT name FROM sysobjects
WHERE name='TestTran' AND type='U')
DROP TABLE TestTran
IF EXISTS(SELECT name FROM sysobjects
WHERE name='procTestTran' AND type='P')
DROP PROCEDURE procTestTran
GOCREATE TABLE TestTran
(
[AutoID] [int] PRIMARY KEY IDENTITY (1, 1) NOT NULL ,
[UserName] varchar(50) NOT NULL
)
GO--存储过程
CREATE PROCEDURE procTestTran
@isCommit int
AS
BEGIN
DECLARE
@a varchar(50),
@TmpWhile int,
@StartMaxID int,
@EndMaxID int
--返回AutoID的最大值给 @StartMaxID
SET @StartMaxID =(SELECT MAX(AutoID) FROM TestTran) --开始事务
BEGIN TRANSACTION
IF @StartMaxID IS NULL SET @StartMaxID = 0
SET @TmpWhile=1
--用一个循环插入5条记录
WHILE @TmpWhile<=5 BEGIN
INSERT INTO TestTran(UserName) VALUES('testname')
SET @TmpWhile=@TmpWhile+1
END
SET @EndMaxID=(SELECT MAX(AutoID) FROM TestTran)
IF @isCommit=1 BEGIN --提交事务的条件
COMMIT TRANSACTION
END ELSE BEGIN
ROLLBACK TRANSACTION
END
PRINT @EndMaxID-@StartMaxID
PRINT CONVERT(varchar(10),@StartMaxID ) + ' | ' + CONVERT(varchar(10),@EndMaxID)
END
GOEXECUTE procTestTran 1
EXECUTE procTestTran 0
EXECUTE procTestTran 0
EXECUTE procTestTran 1/*
我想要的结果就是@EndMaxID-@StartMaxID始终=5
如果 存储过程的参数 <> 1
那么最后AutoID就不是连续的了,那么结果有的也就不是全=5有什么办法可以让ROLLBACK后AutoID不产生断开现象偶对事务不十分熟悉~感觉好象是:
这个事务好像是先把数据写入了表中,如果发现提交条件不成立则执行ROLLBACK,从表中删除这些记录
能不能让事务预先不写入表中,在内存中执行,如果发现条件成立则写入表中,不成立则不写入表中
这样就不会产生标识列断开的现象~!但是用其他程序如:ASP等写的事务就不会产生AutoID断开现象
*/
那么你可以这样做:ALTER PROCEDURE procTestTran
@isCommit int
AS
SET NOCOUNT ON
BEGIN
DECLARE
@a varchar(50),
@TmpWhile int,
@StartMaxID int,
@EndMaxID int
--返回AutoID的最大值给 @StartMaxID
SET @StartMaxID =(SELECT MAX(AutoID) FROM TestTran) --开始事务
BEGIN TRANSACTION
IF @StartMaxID IS NULL SET @StartMaxID = 0
SET @TmpWhile=1
--用一个循环插入5条记录
WHILE @TmpWhile <=5 BEGIN
INSERT INTO TestTran(UserName) VALUES('testname')
SET @TmpWhile=@TmpWhile+1
END
SET @EndMaxID=(SELECT MAX(AutoID) FROM TestTran)
IF @isCommit=1 BEGIN --提交事务的条件
COMMIT TRANSACTION
END ELSE BEGIN
ROLLBACK TRANSACTION
SET @EndMaxID = @EndMaxID - 5
DBCC CHECKIDENT ('dbo.TestTran', RESEED, @EndMaxID)
END
PRINT @EndMaxID-@StartMaxID
PRINT CONVERT(varchar(10),@StartMaxID ) + ' | ' + CONVERT(varchar(10),@EndMaxID)
END
GO
也能保证你的Max-Min之差等于5