具有多个连接的事务(MySql,C#)
Transactions with multiple connections (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();
}
每个 CreateConnection 使用 MySqlConnection::BeginTransaction 创建一个新事务。 CreateConnection 方法创建一个包含 MySqlConnection 的 Connection 对象。 DoRead 函数执行一些 SQL,并在完成后处理 IDataReader。
每个连接在处理后都会进行回滚。
现在做一些笔记:
- 我有一台服务器和多个数据库。
- 我是 运行 MySql 使用 InnoDB 数据库的服务器。
- 我正在对这些数据库进行读取和写入操作。
- 出于性能原因而不是弄乱数据库,我正在使用事务。
- 代码(至少目前)完全是串行的。没有并发线程。所有插入和查询都以串行方式完成。
- 我使用多个数据库连接,因为在进行另一个读取时不允许读取或写入(基本上 reader 对象尚未被释放)。
- 我基本上希望每个连接都能看到所有更改。因此,例如,在 Connection 3 进行了一些写入之后,Connection 1 应该会看到这些。但是数据应该在事务中,而不是写入数据库(还)。
现在,关于我的问题:
- 这个有用吗?只有在调用最后一个 Commit 函数后才会提交所有内容吗?我应该使用其他方法吗?
- 这样对吗?我的方法是完全错误和愚蠢的吗?
- 有什么缺点吗?尤其是性能方面。
谢谢。
呃,好像没人知道。不过没关系。
目前,我只是采用了只使用一个连接并将所有结果读入一个List>的方法,然后关闭reader,从而避免了必须使用多个连接的问题。
可能存在性能问题?也许吧,但这比处理不确定性和僵局要好。
我想问一个问题。我一直在尝试查找有关具有多个连接的事务的一些信息,但我一直无法找到任何好的信息来源。
现在说说我想做的事情。我的代码如下所示:
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。
每个连接在处理后都会进行回滚。
现在做一些笔记:
- 我有一台服务器和多个数据库。
- 我是 运行 MySql 使用 InnoDB 数据库的服务器。
- 我正在对这些数据库进行读取和写入操作。
- 出于性能原因而不是弄乱数据库,我正在使用事务。
- 代码(至少目前)完全是串行的。没有并发线程。所有插入和查询都以串行方式完成。
- 我使用多个数据库连接,因为在进行另一个读取时不允许读取或写入(基本上 reader 对象尚未被释放)。
- 我基本上希望每个连接都能看到所有更改。因此,例如,在 Connection 3 进行了一些写入之后,Connection 1 应该会看到这些。但是数据应该在事务中,而不是写入数据库(还)。
现在,关于我的问题:
- 这个有用吗?只有在调用最后一个 Commit 函数后才会提交所有内容吗?我应该使用其他方法吗?
- 这样对吗?我的方法是完全错误和愚蠢的吗?
- 有什么缺点吗?尤其是性能方面。
谢谢。
呃,好像没人知道。不过没关系。
目前,我只是采用了只使用一个连接并将所有结果读入一个List>的方法,然后关闭reader,从而避免了必须使用多个连接的问题。
可能存在性能问题?也许吧,但这比处理不确定性和僵局要好。