【问题标题】:Transactions with multiple connections (MySql, C#)具有多个连接的事务(MySql、C#)
【发布时间】:2016-05-11 03:54:18
【问题描述】:

我想问一个问题。我一直在尝试查找有关具有多个连接的事务的一些信息,但我无法找到任何好的信息来源。

现在我正在尝试做的事情。我的代码如下所示:

using (var Connection1 = m_Db.CreateConnection())
using (var Connection2 = m_Db.CreateConnection())
{
    Connection1.DoRead(..., (IDataReader Reader) =>
    {
        // Do stuff
        Connection2.DoWrite(...);
        Connection2.DoRead(..., (IDataReader Reader) =>
        {
            // Do more stuff
            using (var Connection3 = m_Db.CreateConnection())
            {
                Connection3.DoWrite(...);
                Connection3.Commit(); // Is this even right?
            }
        });
    });

    Connection1.DoRead(..., (IDataReader) =>
    {
        // Do yet more stuff
    });
    Connection1.Commit();
    Connection2.Commit();
}

每个 CreateConnection 使用 MySqlConnection::BeginTransaction 创建一个新事务。 CreateConnection 方法创建一个包装 MySqlConnection 的 Connection 对象。 DoRead 函数执行一些 SQL,并在完成后释放 IDataReader。

每个连接在处理时都会执行回滚。

现在做一些笔记:

  • 我有一台带有多个数据库的服务器。
  • 我正在使用 InnoDB 数据库运行 MySql 服务器。
  • 我正在对这些数据库进行读写操作。
  • 出于性能原因并且为了不搞乱数据库,我正在使用事务。
  • 代码(至少目前)完全是串行的。没有并发线程。所有插入和查询都以串行方式完成。
  • 我使用到数据库的多个连接,因为在另一次读取正在进行时不允许读取或写入(基本上尚未释放读取器对象)。
  • 我基本上希望每个连接都能看到所有变化。例如,在连接 3 进行一些写入之后,连接 1 应该会看到这些。但数据应该在事务中,而不是写入数据库(目前)。

现在,至于我的问题:

  • 这行得通吗?只有在调用最后一个 Commit 函数后才提交所有内容吗?我应该使用其他方法吗?
  • 是这样吗?我的方法是完全错误和愚蠢的吗?
  • 有什么缺点吗?尤其是在性能方面。

谢谢。

【问题讨论】:

    标签: c# mysql transactions connection


    【解决方案1】:

    Welp,似乎没有人知道。不过没关系。

    目前,我只是采用了只使用一个连接,将所有结果读入一个List的方法>,然后关闭阅读器,从而避免了必须使用多个连接的问题。

    可能存在性能问题?也许吧,但总比不得不处理不确定性和僵局要好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-26
      • 1970-01-01
      • 2023-03-18
      • 2012-05-13
      • 1970-01-01
      • 2012-01-08
      • 2012-09-04
      • 1970-01-01
      相关资源
      最近更新 更多