考虑这个场景;假设我有一个 WPF 窗口,其中有四个对象绑定(bind)到它的控件 (Schedule、Customer、Contract、ScheduleDetails 和 Signer 具体而言)代表后端数据库中的四个数据库表。我希望当用户请求保存他/她输入的信息以加入原子操作时,换句话说,所有保存操作都在一个事务中,因此所有操作都成功或全部失败。 我的问题是在这种情况下表示事务操作的最有效方式是什么
最佳答案
最有效是使用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,它是客户端)。
关于c# - 如何在交易中保存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1985349/