--存储过程如下:
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断开现象

*/

解决方案 »

  1.   

    如果你只是要满足,当你提交的时候,你需要保证@EndMaxID-@StartMaxID始终=5 
    那么你可以这样做: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 
      

  2.   

    这样的话,即使你中间回滚过,那么当你再次提交的时候
    也能保证你的Max-Min之差等于5