我有一个带有方法的数据库类,如下所示。foo和bar都是全无操作。因此,需要进行交易。请注意,我使用的是MySQL 5.5.21和MySQL .NET Connector 6.6.4。
public void foo()
{
using (var transaction = new TransactionScope())
{
// This call yields a 'System.Transactions.TransactionException'
bar();
insertStuff();
transaction.Complete();
}
}
public void bar()
{
using (var transaction = new TransactionScope())
{
insertStuff();
insertStuff();
transaction.Complete();
}
}
private void insertStuff()
{
using (var connection = CreateConnection()) // Using the same connection string!
{
connection.ConnectionString = ConnectionString;
connection.Open();
}
}我确实尝试在构造函数中指定TransactionScopeOption.RequiresNew,但是没有帮助。我还尝试在每个事务范围之前显式地打开一个连接,但仍然没有成功。
我想要的是:
bar,就应该有一个事务。foo (然后调用bar),就应该有一个事务。问:,我是面临MySQL .NET Connector的限制,还是做错了什么?
编辑:准确的错误是:操作对事务的状态无效。所以,一旦我在连接上打电话给Open(),交易就会中断.
发布于 2012-11-12 09:22:52
如图所示使用bar:
public void bar()
{
insertStuff();
insertStuff();
}起作用了吗?
对于最佳实践,您可以使用IDbConnection.BeginTransaction()创建事务,因为事务是连接范围的。
public void foo()
{
using(IDbConnection connection = new MySqlConnection(/*connection string*/))
{
connection.Open();
using(IDbTransction transaction = connection.BeginTransaction())
{
bar(connection);
insertStuff(connection);
transaction.Commit();
}
}
}
public void bar(IDbConnection connection)
{
insertStuff(connection);
insertStuff(connection);
}
private void insertStuff(IDbConnection connection)
{
// do stuff
}发布于 2012-11-12 09:07:08
最有可能的情况是,您正在打开两个或更多到数据库的连接,并且在事务范围内,将调用MSDTC。通常,如果您想拥有一个事务,您将创建连接,然后将其传递给每个操作。这将确保您始终对同一连接进行更改。如果您有2个连接,那么每个连接上的更改都必须进行协调。
但是,如果您提供了更多的异常消息,则可能会更清楚原因。
https://stackoverflow.com/questions/13340758
复制相似问题