2016-02-02 21 views
0

我想问一个问题。我一直在试图找到一些有关多连接交易的信息,但我一直没能找到任何好的信息来源。具有多个连接的交易(MySql,C#)

现在为我想要做的。我有一些代码,看起来像这样:

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(); 
} 

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

每个连接都会在处置时进行回滚。

现在对于一些注意事项:

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

现在,我的问题:

  • 工作的呢?只有在调用最后一个Commit函数后才会提交所有内容?我应该用另一种方法吗?
  • 这是正确的吗?我的方法是完全彻底错误而愚蠢的吗?
  • 有什么缺点?特别是关于性能。

谢谢。

回答

0

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

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

可能会出现性能问题?也许吧,但总比不得不面对不确定性和僵局。