2009-12-31 38 views
3

考虑这种情况;假设我有WPF窗口,它有四个对象绑定到其控件 (Schedule,Customer,Contract,ScheduleDetails和Signer),它们代表后端数据库中的四个数据库表。我希望当用户请求保存他/她在原子操作中加入的信息时,换句话说,所有的保存操作都在一个事务中,以使所有操作成功或全部失败。 我的问题是什么是代表在这种情况下如何在交易中保存?

回答

4

事务操作的最有效的方式最有效是使用BeginTransaction等您DbConnection,但这并不方便,因为你必须使用相同的连接,每个DbCommand需要transaction设置等

简单TransactionScope,如果你是SQL-Server 2005或以上,你很少会注意到这一点,并BeginTransaction之间显著的性能差异:

using(var tran = new TransactionScope()) { 
    SaveA(); 
    SaveB(); 
    SaveC(); 
    SaveD(); 
    tran.Complete(); 
} 

这并不重要,如果SaveA等使用相同的连接,如SqlConnection将自动登记到一个TransactionScope

或者,让一个ORM为你处理;大多数会创建交易以保存一组更改。

有一点要注意; TransactionScope依赖于可能不适用于所有客户端的服务(DTC)(因为您提到的是客户端的WPF)。

+1

如果您使用TransactionScope,请确保您的目标机器具有运行的DTC - 分布式事务处理协调器服务,否则您将收到异常。 – 2009-12-31 13:29:45

+0

@Chris - 我刚刚编辑完毕;-p – 2009-12-31 13:30:27

+1

@Mark,谢谢。但是DTC和Transaction类之间有一个关系 - 我不记得什么时候谈到图片 - 但是我想避免使用DTC的开销,尽管我喜欢Transaction类的简单形式。 DTC交易有没有办法入伍? – 2009-12-31 13:34:36