【问题标题】:Can I run some SQL in a separate transaction, during a transaction我可以在事务期间在单独的事务中运行一些 SQL
【发布时间】:2019-07-05 01:28:42
【问题描述】:

我正在尝试为存储过程创建一些标准日志记录以及我们的标准错误处理。我想在 sproc 的开头调用一个存储过程来记录它已经启动的表,并在最后调用一个存储过程来记录它已经成功完成。我还想从错误处理程序中调用一个存储过程来记录失败和错误消息/编号。

存储过程可能有它自己的事务,或者它的调用堆栈可能已经启动了一个事务,或者可能没有打开事务。无论主事务中发生什么,我都不希望我对日志记录过程的任何调用都被回滚。即日志存储过程的处理需要与主处理完全分开。

是否可以在事务期间像在单独的会话中一样执行某些 SQL?实现这一目标的最简单方法是什么?

顺便说一句,我不能使用 xp_cmdshell,否则我会调用 sqlcmd。

谢谢,

标记

【问题讨论】:

  • 我建议你阅读 Erland 关于错误处理的讨论 here。它讨论了一般的错误处理。另请注意,链接服务器是出了名的脆弱。

标签: sql-server error-handling transactional error-logging


【解决方案1】:

您所描述的是嵌套事务。但是,嵌套事务不是真实的。 https://www.sqlskills.com/blogs/paul/a-sql-server-dba-myth-a-day-2630-nested-transactions-are-real/ 您必须在另一个上下文中进行日志记录。由于您处于存储过程中,因此您必须在日志记录代码中使用动态 sql 才能使其工作。

【讨论】:

  • 不,我不是在描述嵌套事务。我了解保存点以及如何使用它们。我想执行一些完全未连接到现有事务的 SQL。我需要调用一个 sproc,它会立即自行提交,与调用代码是否在事务中完全断开连接。
  • 您在帖子中说“调用堆栈可能已启动事务”。这表明 procA 启动了一个事务,然后您调用您的日志记录过程,然后返回到 procA。根据定义,这是一个嵌套事务。
  • 不是,ProcA 启动事务,然后调用不知道事务的 ProcB。两个 sprocs 都应该调用 logging sprocs(无论事务如何都应该提交)。可能有ProcC、ProcD等。我的意思是事务处理被保存在调用堆栈的某个地方。我本来可以更清楚的。我不喜欢嵌套事务。
  • 但是它们不能独立于调用过程中的事务提交。这就是我要告诉你的。那就是嵌套事务。
  • 我想我在这里找到了我想要的东西:link。如果我使用链接服务器(包装在存储过程中)执行对服务器的回调,它会给我我正在寻找的过程。在单独的会话中有效地执行一段 SQL。
猜你喜欢
  • 1970-01-01
  • 2018-06-19
  • 1970-01-01
  • 1970-01-01
  • 2017-01-23
  • 2023-04-05
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
相关资源
最近更新 更多