您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

在当前事务之外提交事务(例如Oracle中的自主事务)

在当前事务之外提交事务(例如Oracle中的自主事务)

这是一个非常有趣的话题,因此让我们检查一下MS如何处理它。

第一份文档:将Oracle迁移到SQL Server-2014-和-Azure-SQL- DB.pdf

第152页。

本部分描述了SSMA for Oracle V6.0如何处理自主事务(PRAGMA AUTONOMOUS_TRANSACTION)。这些自主事务在Microsoft sql Server 2014中没有直接等效项。

当您将PL / sql块(匿名块,过程,函数,打包过程,打包函数数据库触发器)定义为自主事务时,会将该块中的DML与调用者的事务上下文隔离。该块成为由另一个事务(称为主事务)启动的独立事务。

要将PL / sql标记为自主事务,只需在声明部分中包含以下语句:PRAGMA AUTONOMOUS_TRANSACTION;

使用 扩展过程及其与SSMA 6.0 Extension Pack捆绑在一起的扩展版本 打开新事务。该过程的目的是在新连接中调用任何存储过程,并帮助在函数体内调用存储过程。xp_ora2ms_exec2过程具有以下语法:

xp_ora2ms_exec2
<active_spid> int,
<login_time> datetime,
<ms_db_name> varchar,
<ms_schema_name> varchar,
<ms_procedure_name> varchar,
<bind_to_transaction_flag> varchar,
[optional_parameters_for_procedure];

然后,您需要在服务器上安装存储过程和其他脚本: 适用于Oracle Extension Pack的SSMA(仅适用于Oracle Extension Pack.7.5.0.msi的SSMA)。

您的存储过程将变为:

CREATE TABLE myLogTable(i INT IDENTITY(1,1),
                        d DATETIME DEFAULT GETDATE(),
                        t NVARCHAR(1000));
GO

CREATE OR ALTER PROCEDURE my_logging
   @t NVARCHAR(MAX)
AS
BEGIN
   INSERT INTO myLogTable(t) VALUES (@t);
END;
GO

CREATE OR ALTER PROCEDURE myStoredProcedure
AS
BEGIN
    -- some work
    SELECT 1;
    INSERT INTO myLogTable(t) 
    VALUES ('Standard logging that will perish after rollback');

    DECLARE @login_time DATETIME = GETDATE();
    DECLARE @custom_text_to_log NVARCHAR(100);
    SET @custom_text_to_log=N'some custom loging that should survive rollback';
    DECLARE @database_name SYSNAME = DB_NAME();

    EXEC master.dbo.xp_ora2ms_exec2_ex 
       @@spid,
       @login_time,
       @database_name,
       'dbo',
       'my_logging',
       'N',
       @custom_text_to_log;
END;

最后的电话:

begin transaction
exec myStoredProcedure
rollback transaction
select * from myLogTable;

输出

i   d          t
2   2017-08-21 some custom loging that should survive rollback
Oracle 2022/1/1 18:51:16 有479人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶