2016-11-22 81 views
2

我在開始事務並嘗試提交在SQL Server上啓動的事務時遇到了問題。SQL Server和Oracle之間的分佈式事務

DECLARE @return_value int, 
     @ERROR_MESSAGE nvarchar(2000) 

BEGIN TRANSACTION 
    EXEC @return_value = [dbo].[SEND_EMAIL] 
      @SUBJECT = N'subject', 
      @BODY = N'body', 
      @RECEIVERS = N'[email protected]', 
      @ERROR_MESSAGE = @ERROR_MESSAGE OUTPUT 

    SELECT @ERROR_MESSAGE AS N'@ERROR_MESSAGE' 

    COMMIT TRANSACTION 

    SELECT 'Return Value' = @return_value 
GO 

,並返回這一點: 「無法在交易中爭取」

OLE DB提供程序 「OraOLEDB.Oracle」 鏈接服務器 「linked_server」 返回的消息。

(1行(S)的影響)

消息3930,級別16,狀態1,第16行
當前事務無法提交,無法支持寫入日誌文件的操作。回滾事務。

(1行(一個或多個)受影響)
消息3998,級別16,狀態1,行在一批結束檢測3
提交的事務。事務回滾。

在SQL Server中我的存儲過程是這樣的:

BEGIN TRY 
    EXECUTE('Call Schema.Package.StoredProcedure(?,?,?,?,?)', @subject, @body, @receivers, @vcSendBy, @ERROR_MESSAGE OUT) AT [linked_server] 

END TRY 
BEGIN CATCH 

    SET @ERROR_MESSAGE = error_meessage(); 

END CATCH 

這項工作沒有BEGIN TRANSACTION和COMMIT,但我不知道爲什麼。

在此先感謝。

+0

爲什麼您使用交易發送電子郵件?事務用於保持數據處於一致狀態。發送電子郵件的操作不應改變數據庫狀態。 –

+0

uncommitable事務是我在Jdeveloper 12c中的一個callablestament中的同一個問題,當我試圖獲取一些參數時,上面的代碼是一種手動重現問題的方法 – csuazo

+0

我解決了我在Oracle中執行存儲過程的問題,在我的SQL Server中的存儲過程中,我調用該函數 – csuazo

回答

1

我解決我的問題在執行存儲過程在Oracle中的函數內,在SQL Server我我的存儲過程調用函數

FUNCTION FUNCTION_CALL_SP (
      SUBJECT IN VARCHAR2, 
      BODY IN CLOB, 
      RECEIVERADDRESS IN varchar2, 
      send_by IN varchar2 
) RETURN varchar2 IS 

ERROR_MESSAGE VARCHAR2(400); 

BEGIN 

SP_SEND_EMAIL(
    SUBJECT   => SUBJECT, 
    BODY  => BODY, 
    RECEIVERADDRESS => RECEIVERADDRESS, 
    send_by   => send_by, 
    ERROR_MESSAGE => ERROR_MESSAGE 
); 
return ERROR_MESSAGE; 
END FUNCTION_CALL_SP ; 

現在,在SQL Server中我的存儲過程我有這樣的:

SET @vQuery = 'SELECT @vfResult = A.ERRORMESSAGE FROM OPENQUERY(BCIE,''SELECT SCHEMA.PACKAGE.FUNCTION_SEND_EMAIL('''''[email protected]+''''', '''''[email protected]+''''', '''''[email protected]+''''', '''''[email protected]_BY+''''') ERRORMESSAGE FROM DUAL'') A'; 

    BEGIN TRANSACTION 
    EXEC SP_EXECUTESQL 
       @Query = @vQuery 
      , @Params = N'@vfResult NVARCHAR(MAX) OUTPUT' 
      , @vfResult = @vfResul OUTPUT 

    SET @ERROR_MESSAGE = @vfResult; 
    COMMIT TRANSACTION 

工作正常。

0

您需要使用分佈式事務協調器。如果你的代碼在一個交易中是一個需求,那麼對於你的問題沒有簡單的解答。

在這裏看到的文檔:MSDN Distributed Transactions

下面是關於這個問題的另一個很好的鏈接:DTC

0

由於您的事務跨多個數據庫,你需要確保你使用分佈式事務。有關如何配置服務器,請參閱here

服務器配置後,可以使用以下語法啓動一個分佈式事務:

BEGIN DISTRIBUTED TRAN 
    --INSERT, UPDATE, DELETE Data on SQL Server Table 
    --INSERT, UPDATE, DELETE Data on Oracle Server Table 
COMMIT TRAN