检测是否在事务中调用了存储过程

时间:2016-03-18 10:08:28

标签: sql-server sql-server-2005 transactions

好的 - 所以答案可能就是#Server;所有内容都在SQLServer'中的事务中。但这是我的问题。

我有一个存储过程,它根据一个输入参数返回数据。这是从外部服务调用的,我相信它是基于Java的。

我有一个日志表来查看每次点击此proc的时间。有点像这样(简化)......

TABLE log (ID INT PRIMARY KEY IDENTITY(1,1), Param VARCHAR(10), In DATETIME, Out DATETIME)

PROC troublesome
(@param VARCHAR(10))
BEGIN
    --log the 'in' time and keep the ID
    DECLARE @logid INT
    INSERT log (In,Param) VALUES (GET_DATE(),@param)
    SET @logid = SCOPE_IDENTITY()

    SELECT <some stuff from another table based on @param>

    --set the 'out' time
    UPDATE log SET Out = GET_DATE() WHERE ID = @logid

END

到目前为止,SQL法西斯主义者如此轻易批评。

无论如何 - 当我这样称呼troublesome 'SOMEPARAM'时 - 我得到了SELECT的结果,并且在日志表中有一个很好的新行SOMEPARAM和进出时间戳。

现在 - 我看这个表,即使没有行进入 - 如果我要生成一行,我会看到ID跳过了很多地方。我猜这是由外部客户端代码命中它引起的。他们得到SELECT的结果 - 但我没有得到他们的日志数据。

这告诉我,他们将客户电话打包在TRAN并将其回滚。哪个一个会导致此行为。我想知道...

  • 如果有办法我可以强制写入日志,即使它包含在我无法控制的事务中,并且随后会回滚(似乎不太可能)
  • 如果有一种方法我可以在此proc中确定它是否在事务中执行(并可能引发错误)
  • 如果ID跳过还有其他可能的解释(并且它会在一小时内跳过很多,就像1000个地方一样。所以我确定它是由客户端代码引起的 - 因为他们报告成功检索了SELECT的结果。)

谢谢!

0 个答案:

没有答案