我有SQL Server 2008并希望进行这样的交易:
begin transaction oo;
......
begin try
save transaction xx;
alter table ....; -- this will fail
alter table ....;
alter table ....;
end try
begin catch
rollback transaction xx; -- error here
end catch;
......
commit transaction oo;
在rollback transaction xx;
,我收到消息
3931无法提交当前事务,也无法回滚到保存点。回滚整个交易。
我在这里做错了什么?
更新解释方案:
有一个大事务" oo",它会将数据库的表结构从产品版本X更改为产品版本Y.
在嵌套事务中,应该尝试更改用户特定表(=内部事务)。
如果特定于用户的表被破坏,则不应回滚整个产品升级过程。
另一方面,如果在主产品表升级(外部事务)期间出现其他问题,则不应升级用户特定表。
答案 0 :(得分:1)
你必须在CATCH
块
ROLLBACK TRANSACTION;
将回滚所有交易, 当你在上面的陈述中使用这个(在Q中发布)然后它会 给我们错误
COMMIT TRANSACTION请求没有相应的BEGIN TRANSACTION。
因为你必须把这一行放在TRY
块
COMMIT TRANSACTION oo;
然后最后你的陈述
BEGIN TRANSACTION oo;
BEGIN TRY
SAVE TRANSACTION xx;
CREATE TABLE test (ID INT); -- this will fail from second time
SELECT 3;
COMMIT TRANSACTION oo;
END TRY
BEGIN catch
ROLLBACK TRANSACTION;
END CATCH;
评论后更新
BEGIN TRY
BEGIN TRANSACTION xx1;
select 1; -- this will always success
COMMIT TRANSACTION xx1;
BEGIN TRANSACTION xx2;
CREATE TABLE test (id int); -- this will fail from second time
COMMIT TRANSACTION xx2;
BEGIN TRANSACTION xx3;
select 3; -- this will fail from second time
COMMIT TRANSACTION xx3;
END TRY
BEGIN catch
ROLLBACK TRANSACTION
END CATCH;