【发布时间】: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