![](/img/trans.png)
[英]Can I rollback a transaction that has multiple inner transactions in SQL Server?
[英]SQL Server Transactions how can I commit my transaction
我有SQL Server 2005存儲過程。 有人在事務中調用我的存儲過程。 在我的存儲過程中,我正在記錄一些信息(插入表中)。 當更高級別的事務回滾時,它會刪除我的插入。
無論如何,我可以提交我的插入並阻止更高級別的回滾刪除我的插入?
謝謝
即使您啟動新事務,它也將嵌套在外部事務中。 SQL Server保證回滾將導致未修改的數據庫狀態。 因此,您無法在中止的事務中插入行。
這是一種繞過它的方法,這是一個小技巧。 使用rpc out = true
和remote proc transaction promotion = false
創建鏈接服務器。 鏈接的服務器可以指向運行過程的同一服務器。 然后,您可以使用execte (<query>) at <server>
上的execte (<query>) at <server>
新事務中執行某些操作。
if OBJECT_ID('logs') is not null drop table logs
create table logs (id int primary key identity, msg varchar(max))
if OBJECT_ID('TestSp') is not null drop procedure TestSp
go
create procedure TestSp as
execute ('insert into dbo.logs (msg) values (''test message'')') at LINKEDSERVER
go
begin transaction
exec TestSp
rollback transaction
select top 10 * from logs
即使事務已回滾,這也將以日志表中的一行結束。
以下是創建此類鏈接服務器的示例代碼:
IF EXISTS (SELECT srv.name FROM sys.servers srv WHERE srv.server_id != 0 AND
srv.name = N'LINKEDSERVER')
EXEC master.dbo.sp_dropserver @server=N'LINKEDSERVER',
@droplogins='droplogins'
EXEC master.dbo.sp_addlinkedserver @server = N'LINKEDSERVER',
@srvproduct=N'LOCALHOST', @provider=N'SQLNCLI', @datasrc=N'LOCALHOST',
@catalog=N'DatabaseName'
EXEC master.dbo.sp_serveroption @server=N'LINKEDSERVER', @optname=N'rpc out',
@optvalue=N'true'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'LINKEDSERVER',
@useself=N'True', @locallogin=NULL,@rmtuser=NULL, @rmtpassword=NULL
EXEC master.dbo.sp_serveroption @server=N'LINKEDSERVER',
@optname=N'remote proc transaction promotion', @optvalue=N'false'
在Oracle
您將使用自治事務,但是, SQL Server
不支持它們。
可以聲明一個表變量並從存儲過程中返回它。
表變量在ROLLBACK
,但是,應修改上層代碼以讀取變量並永久存儲其數據。
根據權限,您可以使用xp_cmdshell調用OSQL,從而創建完全獨立的連接。 您可能能夠使用CLR執行類似的操作,但我從未嘗試過。 但是,我強烈建議不要這樣做。
最好的辦法是確定代碼和調用代碼的約定 - 兩者之間支持哪種類型的契約。 您可以規定,您的代碼永遠不會在另一個事務中調用(可能不是一個好主意),或者您可以在發生錯誤時給出調用代碼負責的要求。
交易中的任何內容都將成為該交易的一部分。 如果您不希望它成為該交易的一部分,那么請不要將其放入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.