2
這是使用事務範圍的正確方法:使用的TransactionScope多次
我有代表的東西一部分的對象:
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
實現即用,它不應該有所作爲
是我的假設是否正確?
忽略任何關於對象結構或持久化的責任,這是一個幫助我理解我應該如何做事的例子。部分原因是因爲它似乎不工作,當我嘗試用SqlLite作爲數據庫提供程序工廠替換Oracle時,我想知道應該在哪裏花時間調查。
相關:http://stackoverflow.com/a/22512547/314291 – StuartLC