1.我写了一个存储过程A,调了一个存储过程B,现在我在A搞个事务,调用了B,然后回滚,是否B做的任何修改都会回滚,不管B里调用了其什么存储过程,嵌套了多少层,都会全部回滚?2.truncate table,drop table是否也可以回滚?

解决方案 »

  1.   

    存储过程调存储过程,SQL有BUG,出错时有时不返回错误信息。
      

  2.   

    USE test
    GO
    CREATE TABLE [dbo].[TRANTEST](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [Value] [varchar](200) COLLATE Chinese_PRC_CI_AS NOT NULL,
    [InDate] [datetime] NULL
    ) ON [PRIMARY]INSERT INTO [dbo].[TRANTEST]([Value],[InDate]) VALUES ('325',GETDATE())
    INSERT INTO [dbo].[TRANTEST]([Value],[InDate]) VALUES ('35465',GETDATE())
    INSERT INTO [dbo].[TRANTEST]([Value],[InDate]) VALUES ('32435',GETDATE())
    SELECT *  FROM DBO.TRANTEST WITH (NOLOCK) BEGIN TRAN --事务回滚测试 TRUNCATE TABLE
    TRUNCATE TABLE DBO.TRANTEST
    SELECT *  FROM DBO.TRANTEST WITH (NOLOCK) 
    ROLLBACK TRAN
    SELECT *  FROM DBO.TRANTEST WITH (NOLOCK) --回滚成功
    BEGIN TRAN--事务回滚测试 DROP TABLE
    DROP TABLE DBO.TRANTEST
    ROLLBACK TRAN
    SELECT * FROM DBO.TRANTEST WITH(NOLOCK)--回滚成功
      

  3.   

    USE test
    go
    CREATE TABLE [dbo].[TRANTEST2](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [Value] [varchar](200) COLLATE Chinese_PRC_CI_AS NOT NULL,
    [InDate] [datetime] NULL
    ) ON [PRIMARY]
    /*
    事务中嵌套存储过程的回滚测试
    */
    --EXEC DBO.UP_TRANTEST2
    CREATE PROC DBO.UP_TRANTEST2
    AS
    SET NOCOUNT ON
    SELECT * FROM [dbo].[TRANTEST2]WITH(NOLOCK)
    TRUNCATE TABLE DBO.TRANTEST2
    BEGIN TRANINSERT INTO [dbo].[TRANTEST2]([Value],[InDate]) VALUES ('TEST1',GETDATE())EXEC DBO.UP_TRANTEST3 EXEC DBO.UP_TRANTEST4SELECT * FROM [dbo].[TRANTEST2]WITH(NOLOCK)ROLLBACK TRAN SELECT * FROM [dbo].[TRANTEST2]WITH(NOLOCK)--存储过程1--
      

  4.   

    CREATE PROC DBO.UP_TRANTEST3
    ASSET NOCOUNT ONINSERT INTO [dbo].[TRANTEST2]([Value],[InDate]) VALUES ('TEST2',GETDATE())--存储过程2--