Sql server SQL过程-开始事务并提交
嗨,我正在写一个程序pro_realocate_块, 我正在调用另一个程序pro_remove_分配。如果我为主程序pro_reallocate_块放入BEGIN TRANSACTION,如果主程序中出现任何错误,它将还原子程序pro_remove_分配Sql server SQL过程-开始事务并提交,sql-server,sql-server-2008,Sql Server,Sql Server 2008,嗨,我正在写一个程序pro_realocate_块, 我正在调用另一个程序pro_remove_分配。如果我为主程序pro_reallocate_块放入BEGIN TRANSACTION,如果主程序中出现任何错误,它将还原子程序pro_remove_分配 Create procedure pro_reallocate_block( @blockId int, @blockName nvarchar(max) ) WITH EXECUTE AS CALLER AS
Create procedure pro_reallocate_block(
@blockId int,
@blockName nvarchar(max)
)
WITH EXECUTE AS CALLER
AS
Begin
SET XACT_ABORT, NOCOUNT ON;
BEGIN TRY
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
Declare @AllocatedBlockid int
exec pro_remove_allocation @blockId
if((select COUNT(blockId) from blocks where blockId=@blockId)>0)
select * from blocks where blockId=@blockId
else
select * from blocks where bdefault=1
COMMIT TRANSACTION
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0
BEGIN
ROLLBACK TRANSACTION
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT @ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
END
END CATCH
end
应该可以了,好吧。也许最好的办法是编写一些测试过程并引发一个错误,以查看回滚是否有效。那你就知道了。当你只想检查是否存在时,请不要计算。这就是存在的目的。如果你幸运的话,优化器会发现你的意图并将其转换为等价的存在形式,但是为什么要强迫它做更多的工作呢?达米恩·努非信徒感谢你的建议。。。交易是怎么发生的!