我们看到 MSDTC 记录了以下间歇性警告:
调用者尝试将事务传播到远程系统,但 MSDTC 网络 DTC 访问当前在计算机“X”上被禁用。请检查 MS DTC 配置设置。
然而,MSDTC 在设计上在机器 X 上被禁用 - 它是一台客户端机器,并且没有业务参与事务!
该问题很难重现 - 通常在服务重新启动后。我们怀疑在事务上下文中发生了对客户端计算机的回调。
只是想知道是否有人见过类似的问题?
肯
c# msdtc distributed-transactions system.transactions linq-to-sql
如何在 Java SE(不是 Java EE 或 Spring)中使用事务管理器(例如Bitronix、JBoss TS或Atomikos)来支持以下用例:
假设我们有以下类:
public class Dao {
public void updateDatabase(DB db) {
connet to db
run a sql
}
}
Run Code Online (Sandbox Code Playgroud)
我们从中创建一个 Java Runnable,如下所示:
public class MyRunnable extends Runnable {
Dao dao;
DB db;
public MyRunnable(Dao dao, DB db) {
this.dao=dao;
this.db = db;
}
public run() throws Exception {
return dao.updateDatabase(db);
}
}
Run Code Online (Sandbox Code Playgroud)
现在在我们的服务层中,我们有另一个类:
public class Service {
public void updateDatabases() {
BEGIN TRANSACTION;
ExecutorService es = Executors.newFixedThreadPool(10); …Run Code Online (Sandbox Code Playgroud) 因为我在提交期间有几个不相关的资源来协调,所以我想在Java SQL数据库(JDBC)上使用两阶段提交(2PC).
在标准SQL Server上,您可以执行某些DLL 的复杂安装以及一些脚本以提供一些扩展存储过程,其名称类似于,xp_sqljdbc_xa_init或者xp_sqljdbc_xa_prepare反过来,Microsoft JDBC驱动程序用于提供start/end/prepare /的XA语义承诺.但是从我看到的这些扩展存储过程在Azure上不可用.
此外,SQL Server本身似乎没有任何PREPARE TRANSACTION原语,我也没有在Azure中找到它.
那么如何在Azure上做2PC?
sql-server jdbc distributed-transactions azure azure-sql-database
我读了很多文章并感到困惑。
\n\n意见 1:\n2PC 非常高效,交换的消息数量最少且延迟较低。\n来源:\n http://highscalability.com/paper-consensus-protocols-two-phase-commit
\n\n意见2:\n分布式事务很难扩展到高水平,而且会降低吞吐量。由于2PC保证ACID,由于其复杂的协调算法,带来了很大的负担。\n来源:http ://ivoroshilin.com/2014/03/18/distributed-transactions-and-scalability-issues-in-large-scale-distributed -系统/
\n\n意见3:\n\xe2\x80\x9c一些作者声称两阶段提交的支持成本太高,因为\n它带来了性能或可用性问题。我们认为,最好让应用程序程序员处理由于过度使用事务而出现的性能问题,而不是总是围绕事务的缺乏进行编码。在 Paxos 上运行\n两阶段提交可以缓解可用性问题。\xe2\x80\x9d\n来源:http ://courses.cs.washington.edu/courses/csep552/13sp/lectures/6/spanner.pdf
\n\n意见 4:\n2PC 协调器还代表单点故障,这对于关键系统来说是不可接受的 - 我相信它是协调器。\n来源:http://www.addsimplicity.com/adding_simplicity_an_engi/2006/12/2pc_or_not_2pc_。 html
\n\n前3种意见相互矛盾。第4条我认为是正确的。请澄清什么是错误的,什么是正确的。如果能够给出事实,那就太好了。
\ndatabase scalability 2phase-commit distributed-transactions consensus
是否有一个用于编排 Web 服务的 Java 工具,可以轻松处理事务?
在我的用例中,我想要链接 2 个 SOAP Web 服务:第一个将执行记入客户银行帐户的借记操作,第二个将为他的手机充值相应的金额。如何以事务方式实现此 Web 服务调用序列?
我简要地了解了 Apache Camel,但它似乎不是最合适的工具。
谢谢。
我正在使用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
我在尝试执行包时收到以下错误。我可以成功地执行个人任务。但每当尝试执行整个包时,它都会给我错误。 分布式事务上的 SSIS 数据流 - [执行 SQL 任务] 错误:无法获取连接“targetCon2”。连接可能未正确配置,或者您可能对此连接没有正确的权限。
我浏览了很多链接,但没有任何效果,所以开始一个新线程。我检查了SQL 代理作业 - 连接可能未正确配置,或者您可能对此连接没有正确的权限?
我的分布式事务服务正在运行。DTC 设置正确。我正在按顺序执行所有事情。不知道出了什么问题。我想在一笔交易中执行整个部分。
在我的代码中有要处理的事务:
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
java ×4
transactions ×3
c# ×2
msdtc ×2
sql-server ×2
atomikos ×1
azure ×1
consensus ×1
database ×1
hystrix ×1
jakarta-ee ×1
jboss ×1
jdbc ×1
jta ×1
linq-to-sql ×1
scalability ×1
spring-cloud ×1
ssis ×1