具有多个连接的事务(MySql,C#)

时间:2016-02-02 11:11:54

标签: c# mysql transactions connection

我想问一个问题。我一直试图找到有关多个连接的交易的一些信息,但我还没有找到任何好的信息来源。

现在我想做什么。我的代码看起来像这样:

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函数后才会提交所有内容吗?我应该使用其他方法吗?
  • 这是对的吗?我的方法完全是完全错误和愚蠢的吗?
  • 有什么缺点吗?特别是关于表现。

感谢。

1 个答案:

答案 0 :(得分:0)

Welp,似乎没有人知道。但那没关系。

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

可能存在性能问题吗?也许,但它比处理不确定性和僵局更好。