Sql server 执行问题后的事务计数
我已经编写了一个程序,如下代码行Sql server 执行问题后的事务计数,sql-server,sql-server-2008-r2,Sql Server,Sql Server 2008 R2,我已经编写了一个程序,如下代码行 ALTER PROCEDURE [dbo].[CountrySave] ( @CountryId uniqueidentifier, @CountryName nvarchar(max) ) AS begin tran if exists (select * from Country where CountryID =@CountryId) begin update Country set CountryID = @CountryId, CountryNam
ALTER PROCEDURE [dbo].[CountrySave]
(
@CountryId uniqueidentifier,
@CountryName nvarchar(max)
)
AS
begin tran
if exists (select * from Country where CountryID =@CountryId)
begin
update Country set
CountryID = @CountryId,
CountryName =@CountryName
where CountryID = @CountryId
end
else
begin
insert INTO Country(CountryID, CountryName) values
(NewID(),@CountryName)
end
它抛出“EXECUTE后的事务计数”表示BEGIN和COMMIT语句的数量不匹配。上一个计数=0,当前计数=1
在MARS批处理中启动的事务在批处理结束时仍处于活动状态。该事务将回滚。“执行时出现错误消息!!!
请帮助…添加
COMMIT-TRAN
ALTER PROCEDURE [dbo].[CountrySave]
@CountryId uniqueidentifier,
@CountryName nvarchar(max)
AS
BEGIN
BEGIN TRY
BEGIN TRAN
if exists (select * from Country where CountryID =@CountryId)
begin
update Country
set CountryID = @CountryId,
CountryName =@CountryName
where CountryID = @CountryId;
end
else
begin
insert INTO Country(CountryID, CountryName)
values(NewID(),@CountryName)
end
COMMIT TRAN
END TRY
BEGIN CATCH
/* Error occured log it */
ROLLBACK
END CATCH
END
错误信息相当清楚。当您打开(开始)一项交易时,您还需要在交易结束时做一些事情 因此,您可以
ROLLBACK
事务(以防事务中的一条语句失败),或者COMMIT
事务,以便实际实现您所做的所有更改
从MSDN:
BEGIN TRANSACTION表示由
连接在逻辑上和物理上是一致的。如果错误是
遇到,在开始事务后进行的所有数据修改
可以回滚以将数据返回到
一致性。每个事务都会持续,直到完成其中一个事务为止
发出errors和COMMIT事务以使修改生效
数据库的永久部分,或遇到错误,并且
使用ROLLBACK事务语句删除修改
更多信息:您的问题是您开始了一个事务,但从未提交它/执行回滚 在您的程序中尝试此结构,在过去对我非常有效:
CREATE PROCEDURE [dbo].SomeProc
(@Parameter INT)
AS
BEGIN
--if you want to be to only active transaction then uncomment this:
--IF @@TRANCOUNT > 0
--BEGIN
-- RAISERROR('Other Transactions are active at the moment - Please try again later',16,1)
--END
BEGIN TRANSACTION
BEGIN TRY
/*
DO SOMETHING
*/
COMMIT TRANSACTION
END TRY
BEGIN CATCH
--Custom Error could be raised here
--RAISERROR('Something bad happened when doing something',16,1)
ROLLBACK TRANSACTION
END CATCH
END
如果一切正常,在末尾添加
COMMIT TRAN
。您应该使用BEGIN TRY…BEGIN CATCH
包装您的事务,如果发生错误,请添加代码。。。