【发布时间】:2011-09-26 10:51:09
【问题描述】:
这是使用事务范围的正确方法吗:
我有一个代表事物一部分的对象:
public class ThingPart
{
private DbProviderFactory connectionFactory;
public void SavePart()
{
using (TransactionScope ts = new TransactionScope()
{
///save the bits I want to be done in a single transaction
SavePartA();
SavePartB();
ts.Complete();
}
}
private void SavePartA()
{
using (Connection con = connectionFactory.CreateConnection()
{
con.Open();
Command command = con.CreateCommand();
...
command.ExecuteNonQuery();
}
}
private void SavePartB()
{
using (Connection con = connectionFactory.CreateConnection()
{
con.Open();
Command command = con.CreateCommand();
...
command.ExecuteNonQuery();
}
}
}
还有代表事物的东西:
public class Thing
{
private DbProviderFactory connectionFactory;
public void SaveThing()
{
using (TransactionScope ts = new TransactionScope()
{
///save the bits I want to be done in a single transaction
SaveHeader();
foreach (ThingPart part in parts)
{
part.SavePart();
}
ts.Complete();
}
}
private void SaveHeader()
{
using (Connection con = connectionFactory.CreateConnection()
{
con.Open();
Command command = con.CreateCommand();
...
command.ExecuteNonQuery();
}
}
}
我也有管理很多事情的东西
public class ThingManager
{
public void SaveThings
{
using (TransactionScope ts = new TransactionScope)
{
foreach (Thing thing in things)
{
thing.SaveThing();
}
}
}
}
我的理解是:
- 连接不会是新的,每次都会从池中重复使用(假设 DbProvider 支持连接池并且已启用)
- 事务将是这样的,如果我只是调用
ThingPart.SavePart(从任何其他类的上下文之外),那么 A 部分和 B 部分要么都被保存,要么都不被保存。 - 如果我调用
Thing.Save(从任何其他类的上下文之外),那么标题和所有部分将全部保存或不保存,即所有事情都将发生在同一个事务中 - 如果我打电话给
ThingManager.SaveThings,那么我所有的东西都会被保存或者什么都不会保存,即所有事情都将发生在同一个事务中。 - 如果我更改所使用的
DbProviderFactory实现,它应该不会产生影响
我的假设正确吗?
忽略任何关于对象结构或持久性责任的内容,这是一个帮助我理解我应该如何做事的例子。部分原因是当我尝试将 oracle 替换为 SqlLite 作为数据库提供程序工厂时,它似乎不起作用,我想知道我应该在哪里花时间调查。
【问题讨论】:
标签: transactions connection connection-pooling transactionscope