Dan*_*all 5 sql sql-server transactions
我有 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;
Run Code Online (Sandbox Code Playgroud)
在rollback transaction xx;,我收到消息
3931 当前事务无法提交且无法回滚到保存点。回滚整个事务。
我在这里做错了什么?
更新来解释这个场景:
有一个大事务“oo”,它将数据库的表结构从产品版本X更改为产品版本Y。
在嵌套事务中,应尝试更改特定于用户的表(= 内部事务)。
如果用户特定的表以某种方式损坏,则不应回滚整个产品升级过程。
另一方面,如果在主产品表升级(外部事务)期间出现其他问题,则不应升级用户特定表。
你必须在CATCH块内使用这条线
ROLLBACK TRANSACTION;
Run Code Online (Sandbox Code Playgroud)
这将回滚所有事务,当您在上面的语句(发布在 Q 中)中使用此事务时,它将给我们错误
COMMIT TRANSACTION 请求没有对应的 BEGIN TRANSACTION。
为此,您必须将此行放入TRY块中
COMMIT TRANSACTION oo;
Run Code Online (Sandbox Code Playgroud)
最后你的声明是这样的
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;
Run Code Online (Sandbox Code Playgroud)
评论后更新
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;
Run Code Online (Sandbox Code Playgroud)