Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQLServer2005中模拟自治事务_Sql Server_Sql Server 2005_Transactions_Sqlclr - Fatal编程技术网

Sql server 在SQLServer2005中模拟自治事务

Sql server 在SQLServer2005中模拟自治事务,sql-server,sql-server-2005,transactions,sqlclr,Sql Server,Sql Server 2005,Transactions,Sqlclr,即使回滚了事务,我也需要在不同的表中保留一些日志数据 我已经了解到,在SQL Server中,这样做是不可能的 begin tran t1 insert ... insert ... select ... begin tran t2 insert into log commit tran t2 rollback tran t1 select * from log -- IS EMPTY ALWAYS 所以我尝试破解SQL Server,我制作了CL

即使回滚了事务,我也需要在不同的表中保留一些日志数据

我已经了解到,在SQL Server中,这样做是不可能的

begin tran t1
insert ...
insert ...
select ...
       begin tran t2
         insert into log
       commit tran t2
rollback tran t1
select * from log -- IS EMPTY ALWAYS
所以我尝试破解SQL Server,我制作了CLR,它将日志所需的数据以XML格式导出到本地服务器磁盘。CLR代码非常简单:

File.WriteAllText(fileName, xmlLog.Value.ToString());
在我在生产基地发布之前,我很想听听你们对这项技术的吹捧

这里有几个问题:

  • 在SQLServer2005中,还有其他更好的方法来实现自治事务吗
  • 当SQL Server执行CLR时,保持我的事务未提交怎么会不好(SQL写入的数据量相对较小,大约有50-60条记录,3个整数和4个浮点数)

我建议使用一个表变量,因为它不受事务的影响(这是Martin在问题下方提到的博客中列出的方法之一)。考虑这样做,这将在SQL Server 2005中工作:

DECLARE @TempLog TABLE (FieldList...)

BEGIN TRY

    BEGIN TRAN

    INSERT...

    INSERT INTO @TempLog (FieldList...) VALUES (@Variables or StaticValues...)

    INSERT...

    INSERT INTO @TempLog (FieldList...) VALUES (@Variables or StaticValues...)

    COMMIT TRAN

END TRY
BEGIN CATCH

    IF (@@TRANCOUNT > 0)
    BEGIN
        ROLLBACK TRAN
    END

    /* Maybe add a Log message to note that we ran into an error */
    INSERT INTO @TempLog (FieldList...) VALUES (@Variables or StaticValues...)

END CATCH

INSERT INTO RealLogTable (FieldList...)
    SELECT FieldsList
    FROM @TempLog

请注意,虽然我们正在利用表变量不是事务的一部分这一事实,但这确实会造成一种潜在的情况,即此代码在插入RealLogTable之前执行了提交但出现错误(或服务器崩溃),并且您将丢失对确实执行该操作的数据的日志记录。此时会出现断开连接,因为有数据,但就RealLogTable而言,没有插入数据的记录。但这只是能够绕过交易的一个明显的权衡。

你已经读过这篇文章了吗@Martin我做了一部分,但我认为这项技术只有在MSSQL 2008中才有可能我的作品仍在2005年。在文章的底部,作者说还有3种其他选择适用于两者。另请参见