最近遇到一个错误: Microsoft 分布式事务协调器 (MS DTC) 已取消分布式事务
在论坛的一个回复中提到,原因之一可能是——
已超出 MS DTC 日志文件可容纳的最大活动事务数。如果您希望启动更多并发事务,则必须增加 MS DTC 日志文件的大小。
所以,我很好奇 MS DTC 的日志记录是如何工作的。
1. 是每个分布式事务并且每次事务结束时都会清理文件吗?
或者
2. 是否所有事务日志都会持续存在并且文件会随着时间的推移而增长?(直到达到为 MSDTC.log 文件设置的最大文件大小限制)
我将文件容量从 4MB 更改为 16MB,发现文件大小立即增加,所以我猜测是 1。
但如果有人能详细解释这种“日志记录”是如何工作的,那就太好了。
注意:我对 MS DTC 的工作原理有一定的了解。
有NoSQL的ACID(分布式)数据库,尽管CAP定理.这怎么可能?CAP定理与(可能/不可能)成为ACID之间的关系是什么?
是不可能用于分布式计算机系统同时提供一致性,可用性和分区耐受性.
database acid distributed-computing distributed-transactions nosql
想象一个 Java 生态系统,其中三个独立的 Spring Web 应用程序在不同的 JVM 和不同的机器上运行(不涉及应用程序服务器,只是简单的 servlet 容器)。其中两个应用程序使用自己的数据库,通过 JPA 访问。现在第三个应用程序(协调器)向外界提供服务,一些服务功能执行远程操作,需要其他两个应用程序以事务的方式参与,这意味着如果其中一个应用程序无法在数据库,另一个也应该回滚。问题是:如何使用 Spring 实现这一点?
目前我们正在使用 REST 在应用程序之间进行通信。显然,这不能支持交易,即使有努力做到这一点。
我发现 JTA 能够组织全局事务。JTA 涉及创建参与全局管理事务的 XAResource 实例。如果我理解正确,这些 XAResource 实例可以驻留在单独的 JVM 上。资源的初始化、提交和回滚通过 JMS 通信发生,这意味着它需要消息代理在参与者之间传输消息。存在各种 JTA 实现,我发现 Atomikos 似乎是最常用的。
现在我没有看到的是,如果我在每个应用程序端都有一个 Spring 应用程序,这一切是如何发生的。我还没有找到任何通过网络进行 JTA 的示例项目。我也不明白 XAResources 代表什么。如果我使用 JPA,并说我在存储用户余额的应用程序中有一个 Account 对象,并且我必须减少协调器的余额,我是否应该创建一个允许减少余额的 XAResource 实现?或者 XAResource 是由较低级别的东西实现的,比如 JDBC 驱动程序或 Spring Data JPA?在后一种情况下,我如何为事务协调器提供高级别的 CRUD 操作。
我读了一篇文章说:
我们无法在分布式环境中实现传统的交易系统,如微服务中的两阶段提交。
我完全同意这一点。
但是,如果有人可以解释此问题的确切原因,那就太好了。如果我要通过微服务实现两阶段提交,将会遇到什么问题?
提前致谢
java 2phase-commit distributed-system distributed-transactions microservices
我需要在基于 Spring Boot 的微服务应用程序中解决原子操作。您可以想象 2 个微服务,如图所示。
一项服务用于保存用户权限和凭据作为身份提供者,另一项服务作为应用程序中用于与订单、联系人、地址等配对的用户帐户。
当用户创建新帐户时,我需要创建用于商业目的的用户和用于授权的用户身份。这两个操作都应该作为一个原子操作来执行。这意味着如果失败,机器人必须失败并回滚。如果没有业务用户对象,则无法保存用户凭据。您能告诉我解决此问题的最佳方法是什么或应该采取哪些步骤吗?
我的第一个想法是使用 Feign 的 RestTemplate 调用另一个服务,但我不知道如果第二次失败如何回滚操作。谢谢你的建议。
spring distributed-transactions spring-boot microservices spring-cloud
我正在使用spring cloud来实现我的微服务系统,一个售票平台.场景是,有一个zuul代理,一个eureka注册表和3个服务:用户服务,订单服务和票务服务.服务使用假装声明式REST客户端相互通信.
现在有一个买票的功能,主要流程如下:
1.订单服务接受请求创建订单
2.订单服务创建订单实体具有挂单状态.
3.订购服务呼叫用户服务来处理用户付费.
4.订购服务电话票务服务以更新用户票证.
5.订单服务将订单实体更新为FINISHED.
我想Hystrix Fallback用来实现交易.例如,如果付款流程已完成,但在票证移动期间发生了一些错误.如何尊重用户付款和订单状态.因为用户付款是在其他服务中.
以下是我目前的解决方案,我不确定它是否合适.或者还有其他更好的方法来做到这一点.
首先,OrderResource:
@RestController
@RequestMapping("/api/order")
public class OrderResource {
@HystrixCommand(fallbackMethod = "createFallback")
@PostMapping(value = "/")
public Order create(@RequestBody Order order) {
return orderService.create(order);
}
private Order createFallback(Order order) {
return orderService.createFallback(order);
}
}
Run Code Online (Sandbox Code Playgroud)
然后是OrderService:
@Service
public class OrderService {
@Transactional
public Order create(Order order) {
order.setStatus("PENDING");
order = orderRepository.save(order);
UserPayDTO payDTO = new UserPayDTO();
userCompositeService.payForOrder(payDTO);
order.setStatus("PAID");
order = orderRepository.save(order);
ticketCompositeService.moveTickets(ticketIds, currentUserId);
order.setStatus("FINISHED");
order = orderRepository.save(order);
return order;
}
@Transactional …Run Code Online (Sandbox Code Playgroud) distributed-transactions hystrix microservices spring-cloud spring-cloud-netflix
在我的代码中有要处理的事务:
using (var scope = new TransactionScope())
{
repo1.SaveSomething();
repo2.SaveAnythingElse();
scope.Complete();
}
Run Code Online (Sandbox Code Playgroud)
在 repo1 和 repo2 函数内部使用 using 创建自己的数据库上下文,并处理它们,事务就像一个魅力。
现在我添加另一个这样的代码,它开始丢弃一个异常:
底层提供程序在 Open 上失败。(EntityFramework) 分布式事务管理器 (MSDTC) 的网络访问已被禁用。请使用组件服务管理工具在 MSDTC 的安全配置中为网络访问启用 DTC。(System.Transactions) 事务管理器已禁用对远程/网络事务的支持。
我读到当连接在事务内部打开时,尽管具有相同的 sql server 相同的 db - 它需要 MSDTC 组件来处理它。我将代码更改为以下内容:
using (var scope = new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions() { IsolationLevel = IsolationLevel.ReadCommitted }))
{
....
scope.Complete();
}
Run Code Online (Sandbox Code Playgroud)
现在异常消失了。
我的问题:
我认为简单的问题:) 任何帮助将不胜感激!
c# msdtc entity-framework transactions distributed-transactions
我阅读了一些关于2 Phase Commit/XA 分布式事务以及 JTA 如何支持它的信息。似乎有许多资源管理器 - RM(例如 RDBMS 或 JMS),以及一个管理跨多个 RM 的全局事务的TransactionManager (TM)实例。

我知道最好使用Saga 模式,但想想还是很有趣的:
UPD: 在 JTA 世界 TransactionManager 中,不提供用于跨微服务管理事务的REST API。LIXA 提供了这种能力。除答案外还附有示例的文章:)
java 2phase-commit distributed-system distributed-transactions microservices
我目前正在研究二阶段和三阶段提交。
3PC协议试图通过添加一个额外的阶段preCommit来消除2PC协议\xe2\x80\x99s的系统阻塞问题。正如这里提到的
根据这篇文章,如果协调器在任何时候崩溃,恢复节点可以接管事务并从任何剩余副本查询状态。例如,如果任何剩余副本回复恢复节点它处于预提交状态,则恢复节点将知道失败的协调器已发送预提交消息,并且所有副本已同意提交。
我的问题是,为什么两阶段提交不能做同样的事情?当协调器发生故障时,恢复节点会查询那些剩余的节点并查看其中是否有任何节点已经处于提交阶段?
我已阅读服务器帖子,但仍然不知道三阶段提交试图解决的确切问题是什么以及如何解决?
\n请帮忙!
\njava ×3
transactions ×3
database ×2
jta ×2
msdtc ×2
spring ×2
spring-cloud ×2
acid ×1
c# ×1
hystrix ×1
jakarta-ee ×1
nosql ×1
spring-boot ×1
sql ×1