【发布时间】: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