【问题标题】:Insertion transaction- rollback SQL插入事务 - 回滚 SQL
【发布时间】:2016-05-15 12:14:52
【问题描述】:

我是数据库新手,我尝试创建一个存储过程,将数据插入到多对多关系的表中。如果操作的任何部分失败,那么它必须尝试从整个表中尽可能多地恢复手术。例如,如果一个人想要创建关于出版商和书籍的记录,并且成功创建了出版商,但书籍失败了,那么它应该回滚 书的创作,而不是出版商的创作。

我的代码如下所示:

 BEGIN TRY
      BEGIN TRANSACTION
      DECLARE @serviciuKey int
      DECLARE @specializareKey int


      IF NOT EXISTS (SELECT denumire, moneda, pret FROM Serviciu where denumire=@denumire and moneda=@moneda and pret=@pret)
      BEGIN
        INSERT INTO Serviciu ( denumire, moneda, pret)
        VALUES (@denumire, @moneda, @pret)
      END
      SET @serviciuKey=@@IDENTITY
      SAVE TRANSACTION savepoint

      IF NOT EXISTS (SELECT denumire, descriere FROM Specializare where denumire=@denumire_spec AND descriere=@descriere)
      BEGIN
        INSERT INTO Specializare( denumire, descriere)
        VALUES (@denumire_spec, @descriere)
      END
      SET @specializareKey=@@IDENTITY
      SAVE TRANSACTION savepoint

      IF NOT EXISTS (SELECT * FROM Specializare_Serviciu where cod_specializare=@specializareKey and cod_serviciu=@serviciuKey)
      BEGIN
        INSERT INTO Specializare_Serviciu( cod_specializare, cod_serviciu)
        VALUES (@specializareKey, @serviciuKey)
      END
      SAVE TRANSACTION savepoint
      COMMIT TRANSACTION
   END TRY
   BEGIN CATCH
      IF @@trancount > 0 ROLLBACK TRANSACTION savepoint
      DECLARE @msg nvarchar(2048) = error_message()  
      RAISERROR (@msg, 16, 1)
      RETURN 55555
   END CATCH

当我执行程序时,我有这个错误: 消息 3931,级别 16,状态 1,过程 AddData0,第 76 行 当前事务无法提交,也无法回滚到保存点。回滚整个事务。

此外,当我尝试插入一些已经存在的数据时,它会插入另一个 ID,这意味着 IF NOT EXIST 语句不起作用。

有什么帮助吗?

【问题讨论】:

    标签: sql-server database many-to-many rollback


    【解决方案1】:

    试试这个版本:

    DECLARE @serviciuKey int
    DECLARE @specializareKey int
    
    BEGIN TRY
        BEGIN TRAN
    
        IF NOT EXISTS (SELECT denumire, moneda, pret FROM Serviciu where denumire=@denumire and moneda=@moneda and pret=@pret)
        BEGIN
            INSERT INTO Serviciu ( denumire, moneda, pret)
            VALUES (@denumire, @moneda, @pret)
        END
    
        SET @serviciuKey=scope_identity()
    
        IF NOT EXISTS (SELECT denumire, descriere FROM Specializare where denumire=@denumire_spec AND descriere=@descriere)
        BEGIN
            INSERT INTO Specializare( denumire, descriere)
            VALUES (@denumire_spec, @descriere)
        END
    
        SET @specializareKey=scope_identity()
    
        IF NOT EXISTS (SELECT * FROM Specializare_Serviciu where cod_specializare=@specializareKey and cod_serviciu=@serviciuKey)
        BEGIN
            INSERT INTO Specializare_Serviciu( cod_specializare, cod_serviciu)
            VALUES (@specializareKey, @serviciuKey)
        END
    
        COMMIT TRAN
    END TRY
    BEGIN CATCH
        IF @@trancount > 0 
            ROLLBACK TRAN
    
        DECLARE @msg nvarchar(2048) = error_message()  
        RAISERROR (@msg, 16, 1)
        RETURN 55555
    END CATCH
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多