gpt4 book ai didi

C# 控制跨多个数据库的事务

转载 作者:IT王子 更新时间:2023-10-29 04:26:41 25 4
gpt4 key购买 nike

假设我有一个连接到 n 个数据库的 Windows Form 应用程序,并且打开了 n 个连接同时。

我正在寻找的是一次与所有这些数据库进行交易。

例如,如果我有 2 个数据库连接:

using (ITransaction tx1 = session1.OpenTransaction())
{
using (ITransaction tx2 = session2.OpenTransaction())
{
// Do the query thingy here
}
}

一开始写的一切都很好,但是当我想到处查询时,事情就变得有点多余了,更不用说添加新连接的可能性了。

我想要的是循环所有已注册的 session 并将其包装在一个服务中,可能是这样的:

class TransactionManager
{
private ISession[] _sessions;

public TransactionManager(string[] connectionStrings)
{
// Initialize the sessions here
}

public function DoTransaction(string query)
{
foreach (ISession session in _sessions)
{
// What to do here? Using? Try-catch?
}
}
}

如果我在 foreach 循环中使用 using,这意味着如果连接 A 成功但连接 B 不成功,则只有连接 B 会回滚。

最佳答案

看来您可能正在重新发明 TransactionScope .在一个工作单元下完成所有这些工作很简单*:

  using (TransactionScope scope = new TransactionScope())
{
... Do Stuff with Connection 1 using SqlDataReader
... Do Stuff with Connection 2 using Entity Framework
... Do Stuff with Connection 3 on another Oracle Database
... And for good measure do some stuff in MSMQ or other DTC resource
scope.Complete(); // If you are happy
}

Stuff 根本不需要内联 - 它可以在不同的类或不同的程序集中。无需使用 TransactionScope 显式注册数据库或队列连接 - 一切都会自动发生,前提是您使用的资源能够 enlist into an ambient transaction .

现在是小字:

  • * 当您同时使用多个数据库连接、不同的连接字符串或多种技术时,这将需要 2 phase commit并升级到 DTC 事务以确保跨资源的 ACID。 DTC 本身有更多的小字体和更多的姿势 challenges in a corporate network , 比如 firewalls , clustering , security configurationbugs .

  • 但是,对于 MS Sql Server 上的轻量级事务,如果您可以使用相同的数据库和相同的方式保持所有连接连接字符串设置,并在打开前关闭每个连接下一个,那你can avoidDTC .

  • 跨多个 ACID 资源维护事务将始终保持对这些资源的锁定,直到事务被提交或回滚。这通常不利于大批量企业的睦邻关系,因此请务必考虑锁定的后果。

  • 如果 Stuff 是跨多个线程完成的,您将需要加入 DependentTransaction

  • 最后一点值得一提的是 TransactionScope 的默认隔离级别是 Serializable,这很容易出现死锁。在大多数非关键场景中,您可能可以将其降低到 Read Committed .

关于C# 控制跨多个数据库的事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22512450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com