java - 微服务和事务管理器如何处理并发问题

标签 java concurrency microservices distributed-transactions optimistic-locking

我正在构建一个微服务,该服务使用基于 Java Transaction API(JTA)实现的事务管理器。

我的问题是Trasaction maanger是否有能力处理分布式数据库场景的并发问题。

场景:

假设有一个服务的多个实例正在运行,并且我们收到两个将帐户中的余额金额更新为 10 的请求。最初,一个帐户可以有 100 美元,第一个实例获取该金额并将其增加到 10 美元,但尚未提交。

同时,第二个实例还检索仍为 100 的帐户,并将其增加 10 美元,然后提交将余额更新为 110 美元,然后再次为第一个实例提供服务,将帐户更新为 110 美元。

此时您一定已经想到余额应该增加 20 美元而不是 10 美元。我是否必须编写某种乐观锁异常机制来防止上述情况,或者基于 JTA 规范的事务管理器已经确保这样的事不会发生吗?

最佳答案

does Trasaction maanger have ability to handle concurrency issue in distributed database scenario's .

事务和并发是两个独立的概念,尽管事务在我们也看到并发的上下文中变得最重要,但如果没有并发,事务也可能很重要。

回答您的问题:不,事务管理器通常不关心处理并发更新引起的问题。它采用一种非常天真的和简单的(通常也是最有意义的)方法:如果在事务开始后,它检测到状态变得不一致(因为并发更新),它只会将其作为异常引发并回滚事务。只有它能够确定事务的 ACID 属性的所有条件仍然有效,才会提交事务。

关于java - 微服务和事务管理器如何处理并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51733502/

相关文章:

authentication - 如何跨微服务实现 session 身份验证?

java - Jodatime 计算 2 个日期范围(几乎是一年)之间的期间的错误

java - 如何在 Eclipse 上使用我的 java 类文件更新外部 jar

Java ExecutorService invokeAll() 中断

java - Callable 和 Future 接口(interface)中泛型的使用?

java - spring-boot: 运行多模块 Maven 项目

java - Spring Boot 服务在空闲或服务请求过多后自动关闭

java - 从 panel2 中的按钮添加到 panel1 中的文本字段

java - android项目中Intellij-Idea的渲染问题

c - C linux 命名信号量和flock哪个更好