Sql server 在SQLServer2005中模拟自治事务
即使回滚了事务,我也需要在不同的表中保留一些日志数据 我已经了解到,在SQL Server中,这样做是不可能的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
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个浮点数)
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种其他选择适用于两者。另请参见