我应该使用什么来确保在C#中一起执行代码块?

时间:2014-01-09 17:09:40

标签: c# asp.net atomic

我在C#中有一个3层Web应用程序。

我在业务层中有一个简单的方法,它调用数据库层中的另一个方法在数据库中插入信息。

当控件返回业务层时,我检查了结果变量,如果它是肯定的,则表示信息已插入数据库中。然后,如果是肯定的,我打电话给另一种方法发送电子邮件。

我想知道,如果服务器在这个中间离线会发生这种情况?例如,在插入信息之后但在发送邮件之前。

如何解决这种情况并使这段代码以原子方式运行?使用交易? (不确定如何在不同的类库中通过不同的方法使用它。)

非常感谢。

4 个答案:

答案 0 :(得分:3)

分开这些问题。让您的业务层写入值,使用新字段“MailSent”或设置为False。让另一项服务轮询结果表中的未发送邮件,并完成这些工作。

答案 1 :(得分:1)

您可以在事务中运行所有数据库操作,但实际上无法确保在事务中间发送邮件。即使你认为你可以发送电子邮件到smtp服务器进行交付,邮件交付也不保证任何人!

  1. 邮件服务器可能无法向外连接到互联网或无论何时将邮件中继到。
  2. 它可能能够连接,但奇怪的事情发生,消息可能会被延迟(如在它立即连接,但连接被丢弃的情况下)
  3. 不要让自己疯狂。这是一个短暂的驱动器。

答案 2 :(得分:1)

通过中继发送电子邮件有时需要时间,因此您不想等待电子邮件是失败还是成功。

然而,没有正确或错误的答案。这是我的两分钱。

正如你所说,阻止的第二个代码是发送电子邮件。在我们的网站中,我们使用单独的流程发送电子邮件。这是它的工作原理 -

  1. 使用交易将信息输入信息表和数据库中的 EmailQueue

  2. 后台流程会从 EmailQueue (每5分钟发送一次)发送电子邮件并发送电子邮件

  3. 如果电子邮件成功,请将电子邮件标记为已发送

  4. 如果电子邮件失败,请增加尝试计数器,直至达到某个限制(比方说3次)

  5. 如果服务器像您说的那样脱机并再次进行备份,后台进程将从EmailQueue (尚未发送且少于尝试限制)中接收电子邮件

答案 3 :(得分:0)

尽管返回布尔结果。维护一个名为Outbox的表,如果条件满足,则在其中插入一行。

当您的问题中提到的控件返回到您的业务层时。处理所有发件箱邮件,即发送发件箱中的所有邮件并从发件箱中删除条目或更新发件箱表中的列,该列将代表电子邮件状态。