事务应该处于 WCF 服务级别还是数据库访问级别?

Should a transaction be at WCF service level or at Database access level?

据我所知,您可以通过在操作上使用属性来让 WCF 自动创建事务,如下所示:

[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]

在这样的界面上:

[TransactionFlow(TransactionFlowOption.Mandatory)]

我也知道从数据库读取时可以使用 ADO.Net 创建事务,所以我的问题是哪个是最佳选择?在 WCF 级别还是数据库级别?还是要看具体场景?

ADO.NET (local) transaction is tied directly to the database connection (SqlConnection),这意味着您必须不断传递连接并且不允许跨数据库工作。这是您最快的选择。

WCF 方式允许您进行环境事务。除了您记下的属性,您还需要 TransactionScope。 TransactionScope 的优势之一是它不仅仅与数据库相关联。任何事务感知提供者都可以使用它。此外,它还可以处理跨越多个连接的事务。如果您需要使用多个数据源,MSDTC 就会发挥作用。 MSDTC 实施两阶段提交协议。分布式事务比本地事务慢。

所以答案是 - 这真的取决于您的要求。但是,如果您只处理单个数据库上的 CRUD 操作,那么 ADO.NET 个事务就足够了。