set
XACT_ABORT
ON
--
-如果不設置該項為ON,在sql中默認為OFF,那么只只回滾產生錯誤的 Transact-SQL 語句;設為ON,回滾整個事務
begin tran t1 -- -啟動一個事務
update [ water ] . [ dbo ] . [ ErrorInf ]
set ErrorMessage = ' test '
where ID = 6
insert into [ water ] . [ dbo ] . [ ErrorInf ] ( [ ID ] ,ErrorMessage, [ Description ] )
Values ( 1 , ' test1 ' , ' test1 ' )
commit tran t1 -- -提交事務
begin tran t1 -- -啟動一個事務
update [ water ] . [ dbo ] . [ ErrorInf ]
set ErrorMessage = ' test '
where ID = 6
insert into [ water ] . [ dbo ] . [ ErrorInf ] ( [ ID ] ,ErrorMessage, [ Description ] )
Values ( 1 , ' test1 ' , ' test1 ' )
commit tran t1 -- -提交事務
功能:實現begin tran 和commit tran之間的語句,任一如果出現錯誤,所有都不執
事務不是有錯就回滾的,在不寫rollback的情況下,並不是什么錯誤都會回滾事務,有時回滾當前語句,有時回滾整個事務
如例
begin
tran
insert into dbo.area values ( ' 1111 ' )
insert into dbo.area values ( ' 2222 ' )
select 1 / 0
insert into dbo.area values ( ' 333 ' )
commit
insert into dbo.area values ( ' 1111 ' )
insert into dbo.area values ( ' 2222 ' )
select 1 / 0
insert into dbo.area values ( ' 333 ' )
commit
像這樣,就算中間有錯,也不會回滾,結果會成功添加三條記錄
但有人說,比如重大錯誤,這事務也會所有回滾,只是我無法重現重大錯誤罷了
普通錯誤如果想回滾整個事務,只要加個set XACT_ABORT on就可以了
set
XACT_ABORT
on
begin tran
insert into dbo.area values ( ' 1111 ' )
insert into dbo.area values ( ' 2222 ' )
select 1 / 0
insert into dbo.area values ( ' 333 ' )
commit
begin tran
insert into dbo.area values ( ' 1111 ' )
insert into dbo.area values ( ' 2222 ' )
select 1 / 0
insert into dbo.area values ( ' 333 ' )
commit
但也有人寫一堆@@error,如
begin
tran
insert into dbo.area values ( ' 1111 ' )
if @@error > 0
rollback
insert into dbo.area values ( ' 2222 ' )
if @@error > 0
rollback
select 1 / 0
if @@error > 0
rollback
insert into dbo.area values ( ' 333 ' )
if @@error > 0
rollback
commit
insert into dbo.area values ( ' 1111 ' )
if @@error > 0
rollback
insert into dbo.area values ( ' 2222 ' )
if @@error > 0
rollback
select 1 / 0
if @@error > 0
rollback
insert into dbo.area values ( ' 333 ' )
if @@error > 0
rollback
commit
當然也行,不過寫起來太麻煩了.
后來發現sql2005支持try
BEGIN
TRY
BEGIN TRANSACTION
insert into dbo.area values ( ' 1111 ' )
insert into dbo.area values ( ' 2222 ' )
select 1 / 0
insert into dbo.area values ( ' 333 ' )
COMMIT
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
DECLARE @ErrMsg nvarchar ( 4000 ), @ErrSeverity int
SELECT @ErrMsg = ERROR_MESSAGE(),
@ErrSeverity = ERROR_SEVERITY()
RAISERROR ( @ErrMsg , @ErrSeverity , 1 )
END CATCH
BEGIN TRANSACTION
insert into dbo.area values ( ' 1111 ' )
insert into dbo.area values ( ' 2222 ' )
select 1 / 0
insert into dbo.area values ( ' 333 ' )
COMMIT
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
DECLARE @ErrMsg nvarchar ( 4000 ), @ErrSeverity int
SELECT @ErrMsg = ERROR_MESSAGE(),
@ErrSeverity = ERROR_SEVERITY()
RAISERROR ( @ErrMsg , @ErrSeverity , 1 )
END CATCH