c# - 如何在交易中保存?

标签 c# wpf design-patterns transactions

考虑这个场景;假设我有一个 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/

相关文章:

java - 设计问题: Dynamically changing GUI -> sending implementation classes as soap attachments

c# - 二进制搜索对象列表?

c# - 带有异步 lambda 表达式的异步方法

c# - ObservableCollection<> 不会绑定(bind)更改

wpf - 在 Outlook 中显示 WPF 窗口时的奇怪行为

c# - 在 C# 中使用接口(interface)有哪些优点?

vb.net - 如何最好地加密/解密 SQL Server 数据以防止开发人员看到它?

c# - 使用 ASP.NET Web API 进行依赖注入(inject)

c# - “The assembly to be debugged was built with a platform incompatible with the current system.”

c# - 在 Caliburn Micro 中使用 Telerik RadWindow 和自定义 WindowManager 的问题