簡體   English   中英

SQL Server事務如何提交我的事務

[英]SQL Server Transactions how can I commit my transaction

我有SQL Server 2005存儲過程。 有人在事務中調用我的存儲過程。 在我的存儲過程中,我正在記錄一些信息(插入表中)。 當更高級別的事務回滾時,它會刪除我的插入。

無論如何,我可以提交我的插入並阻止更高級別的回滾刪除我的插入?

謝謝

即使您啟動新事務,它也將嵌套在外部事務中。 SQL Server保證回滾將導致未修改的數據庫狀態。 因此,您無法在中止的事務中插入行。

這是一種繞過它的方法,這是一個小技巧。 使用rpc out = trueremote 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM