TransactionScope:发生崩溃时,分布式事务是否存在幽灵事务的风险?

TransactionScope: is there a risk of ghost transactions with distributed transactions when a crash is occuring?

我在 TransactionScope class 和 SQL 服务器和 PostgreSQL.

中使用分布式事务

我对潜在的崩溃有一些担忧,如果在提交整个分布式事务时发生这种情况,我想知道是否有潜在的准备好的事务遗留下来并卡在 PostgreSQL 或 SQL服务器?如果是这样,如何避免?

[编辑 1]

我也强烈建议阅读下面的评论article

我引用:

[...] What if it is an Oracle db running on Linux? Or a RavenDB running on the cloud? In both cases, a proxy has to be used.

[...] You have to go and manually resolve those issues, because as a result of this issue, you have permanently locked transactions.

[编辑 2] 添加更多信息 TransactionScope: https://www.codeproject.com/Articles/690136/All-About-TransactionScope

我不能代表 SQL 服务器,但在 Postgres 中,是的,这可能会发生。

理论上,事务管理器(控制分布式事务的软件)有责任清理它们。

如果事务管理器没有正确清理(例如在崩溃后),那么您需要手动清理。

您可以使用系统视图pg_prepared_xacts 来监控"prepared transactions"。

您可以查询该视图并检查交易的年龄。如果该年龄超过某个阈值(适合您的环境),那么您可以使用 rollback prepared

手动终止它们

是的,这是可能的 - 但这是极不可能的,因为打开的事务将被回滚。

System.Transaction 依赖于 windows 集成事务代理,它实现了 3 阶段提交。您的系统必须在非常特定的时刻崩溃才能出现问题(这会导致交易中断,可以在 tx 管理器 ui 中手动回滚)。并使用多个资源(即 2 个数据库连接),否则它只会包装本地一个资源事务。

有些系统使用 5 阶段提交协议是有原因的(因此有可能出现问题)但它已经非常可靠了。请注意,tx 被写入持久日志,除非您只谈论一个事务资源。