这是使用交易范围的正确方法吗?
我有一个代表事物一部分的对象:
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();
}
}
}
}
我的理解是:
ThingPart.SavePart
(来自任何其他类的上下文之外),那么事务将是这样的,那么A和B部分既可以保存,也可以保存。 Thing.Save
(来自任何其他类的上下文之外),那么标题和所有部分将全部保存或不保存,即一切都将在同一事务中发生ThingManager.SaveThings
,那么我的所有东西都会被保存,或者一切都没有,即一切都会在同一笔交易中发生。DbProviderFactory
实现,则不应该有所作为我的假设是否正确?
忽略关于对象结构或持久性责任的任何事情,这是一个帮助我理解我应该如何做事的例子。部分是因为当我尝试用SqlLite替换oracle作为db提供程序工厂时它似乎无法工作,我想知道我应该在哪里花时间调查。
答案 0 :(得分:3)
回答你的子弹(我假设是Microsoft SQL Server 2005或更高版本):
连接不会是新的,并且会从池中重复使用
只有一个问题 - new TransactionScope() defaults to isolation level READ_SERIALIZABLE - 对于大多数情况来说,这通常是过于悲观 - 通常认为READ COMMITTED更适用。