我正在SQL Server和PostgreSQL的TransactionScope
类中使用分布式事务。
我担心潜在的崩溃,如果在提交整个分布式事务时发生了崩溃,我想知道是否存在关于PostgreSQL或SQL Server的潜在准备事务并被卡住?如果是这种情况,如何避免这种情况?
[编辑1]
我也强烈建议您阅读下面article下面的评论。
我引用:
[...]如果它是在Linux上运行的Oracle数据库?还是在云上运行的RavenDB?在这两种情况下,都必须使用代理。
[...]您必须去手动解决这些问题,因为由于此问题,您已永久锁定了事务。
[编辑2]TransactionScope
添加更多信息:TransactionScope
我不能代表SQL Server,但是在Postgres中,可以的。
理论上,事务管理器(控制分布式事务的软件)负责清理它们。
[如果交易管理器未正确清理(例如,崩溃后),则需要手动进行清理。
您可以使用系统视图https://www.codeproject.com/Articles/690136/All-About-TransactionScope来监视“准备的交易”。
您可以查询该视图并检查交易的期限。如果该年龄超过某个阈值(适合您的环境),则可以使用pg_prepared_xacts
手动终止它们是的,有可能-但由于公开交易将被回滚,这是极不可能的。
System.Transaction依赖于Windows集成事务代理,该代理实现了3期提交。您的系统必须在非常特定的时间内崩溃以解决问题(这会导致损坏的Transaciotn,可以在tx管理器ui中手动回滚)。并使用多个资源(即2个数据库连接),否则仅包装一个本地资源事务。
某些系统使用5相提交协议的原因(因此有可能出现问题),但是它已经非常可靠了。请注意,除非您只谈论一种事务资源,否则将tx写入永久日志。