【问题标题】:Using stored procedure within transactionscope在事务范围内使用存储过程
【发布时间】:2013-07-18 06:38:07
【问题描述】:

我在我的 c# 应用程序中执行一个存储过程,我应该使用 TransactionScope 将它包含在下面吗?

protected void rbl_SystemStatus_SelectedIndexChanged(object sender, EventArgs e)
{
    using (TransactionScope scope = new TransactionScope())
    {
        AdminData.myFunction();
        scope.Complete();
    }
}

myFunction() 在我的 SQL Server 数据库中执行一个存储过程,存储过程内容如下

UPDATE Table A SET...
UPDATE Table B SET ...
DELETE FROM Table C WHERE ...

【问题讨论】:

  • “我应该附上它吗...”是一个只有 you 才能回答的问题 - 您是否希望/需要过程中的所有 3 条语句在单个事务中运行?
  • @Damien_The_Unbeliever 我的问题与语法有关,我想知道我是否像上面那样编写代码,所有 3 条语句应该一起运行,否则它们将无法运行,如果我不编写代码像上面这样一个可以运行,其他的可能不行?

标签: c# sql-server-2005 stored-procedures transactions transactionscope


【解决方案1】:

“我应该”是主观的和上下文相关的(例如,它可能未启用;或者您可能使用基于连接的事务;或者您可能不需要任何事务);但这当然是您可以使用的选项。是否“如下”取决于创建/打开连接的确切位置,因为连接只会在事务范围内自动登记,因为它们在事务范围内被初始化。如果连接是在 myFunction 内创建/打开的,那么它应该可以工作(警告:除非连接字符串将 Enlist 明确设置为 false)。

【讨论】:

  • 我的问题与语法有关,我从您所写的内容中了解到,如果 transactionscope 包含 (con.open - con.close) 部分,则使用此 con 完成的任何进程都将被取消,如果单个遇到错误,对吗?
  • @HOY 再次,这取决于我看不到的代码。 IF 连接是在 inside 事务范围内创建的,并且 IF 连接字符串不会故意阻止登记,那么是的。另外,我不记得确切的场景,但是在一些早期的实现中(我在这里注意到“sql-server-2005”标签)有一些场景可能导致 SPID losing他们的环境事务,而是在 nul 事务中工作。固定多年,但是:这是一个旧版本。
猜你喜欢
  • 2010-09-11
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
相关资源
最近更新 更多