标签: distributed-transactions

事务处理多层应用程序

是否有可能跨多个系统进行交易?

例如:

第1层 - 公开Web服务(部署到weblogic)第2层 - .NET前端(部署到IIS)

我们可以为从.NET发起的多个Web服务调用进行事务提交或回滚吗?

如果是这样,有人可以指出任何资源或文件吗?并且是否有任何特殊要求每个层都遵守参与交易?

.net java distributed-transactions

7
推荐指数
1
解决办法
418
查看次数

我可以将NHibernate的AdoNetTransactionFactory与分布式事务一起使用吗?

我正在处理与Wiber服务中的NHibernate和分布式事务相关的奇怪问题.有关更多详细信息,请参阅导致'服务器无法恢复事务的死锁'与NHibernate和分布式事务.

似乎解决我的问题的一件事是使用NHibernate的AdoNetTransactionFactory,而不是AdoNetWithDistributedTransactionsFactory.

我相信AdoNetWithDistributedTransactionsFactory涉及使NHibernate的第二级缓存机制正常工作,但我们没有使用它.使用AdoNetTransactionFactory与分布式事务有什么(如果有的话)存在其他问题?

谢谢你的时间!

nhibernate distributed-transactions

7
推荐指数
1
解决办法
1084
查看次数

两阶段提交是否可以防止最终提交失败?

假设分布式事务中涉及的所有数据库都使用两阶段提交信号实现,它们已准备好提交并具有必要的锁定.协调器发出提交信号,所有数据库都执行它们的部分事务,但是一个SQL数据库由于编程监督而未能考虑这种可能性而遇到零除错误.由于协调员已经发信号通知每个人因为除零而发生的事情是什么?

database transactions 2phase-commit distributed-transactions

7
推荐指数
1
解决办法
771
查看次数

为什么我们需要在MSMQ/RabbitMQ等消息排队系统之上的服务总线框架,如NService Bus/MassTransit?

在分布式消息事务世界中,我试图理解开发分布式系统所涉及的不同部分.据我所知,您可以使用支持消息队列系统的企业总线设计消息传递系统.为什么两者都使用是个好主意?通过仅对消息排队系统进行编程可以实现同样的目的吗?将两者结合使用有什么好处?

msmq masstransit nservicebus distributed-transactions rabbitmq

7
推荐指数
1
解决办法
1944
查看次数

Spring JMS监听器中的事务管理

我有一个正在侦听队列的spring JMS侦听器.一旦消息到达输入队列,它就对消息进行某些处理,并将消息放到多个其他队列中进行进一步处理(我们可以将这些其他队列称为输出队列).当它发布到其他输出队列时,如果将消息发布到其中一个输出队列可能由于任何原因而失败,我想确保在故障之前完成的输出队列的其他帖子被回滚.基本上我想确保它作为原子操作.在侦听器/容器上是否有任何注释/配置可用于在单个事务中实现此目的.

这是我正在使用的配置

<jms:listener-container acknowledge="transacted" cache="session" connection-factory="jmsSecurityFactory" concurrency="1" container-type="default" container-class="abc.xyz">
<jms:listener id="listenerId" destination="inputQueue" ref="" />
</jms:listener-container>
<beans:bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<beans:property name="sessionTransacted" value="true"></beans:property>
<beans:property name="connectionFactory" ref="inCachingConnectionFactory"></beans:property>
</beans:bean>
<beans:bean id="inCachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
    <beans:property name="targetConnectionFactory" ref="jmsSecurityFactory" />
</beans:bean>
<beans:bean id="jmsSecurityFactory"
    class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter">
    <beans:property name="targetConnectionFactory" ref="jmsConnectionFactory" />
    <beans:property name="username" value=" " />
    <beans:property name="password" value=" " />
</beans:bean>
<beans:bean id="jmsConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
    <beans:property name="hostName" value="${mq.conn.hostName}" />
    <beans:property name="port" value="${mq.conn.hostPort}" />
    <beans:property name="queueManager" value="${mq.conn.queueManager}" />
    <beans:property name="channel" value="${mq.conn.channel}" />
    <beans:property name="transportType" value="${mq.conn.transportType}" />
    <beans:property name="useConnectionPooling" value="true"></beans:property>
</beans:bean>
Run Code Online (Sandbox Code Playgroud)

它看起来像JMS模板和监听器容器都引用相同的连接工厂bean(jmsConnectionFactory)

java spring transactions distributed-transactions spring-jms

7
推荐指数
1
解决办法
1万
查看次数

sql server和mysql之间链接服务器上的分布式事务

我有一张Table1关于SQL Server 2014和MySQL 的表.

Table1
ID INT,Code VARCHAR(100)
Run Code Online (Sandbox Code Playgroud)

MyLinkedServer使用"Microsoft OLEDB Provider for ODBC"在SQL Server中创建了一个链接服务器.

**链接服务器**

EXEC master.dbo.sp_addlinkedserver @server = N'MyLinkedServer', @srvproduct=N'MyLinkedServer', @provider=N'MSDASQL', @datasrc=N'MyLinkedServer'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'MyLinkedServer',@useself=N'False',@locallogin=NULL,@rmtuser=N'username',@rmtpassword='########'
Run Code Online (Sandbox Code Playgroud)

链接服务器设置

EXEC master.dbo.sp_serveroption @server=N'MyLinkedServer', @optname=N'data access', @optvalue=N'true'
EXEC master.dbo.sp_serveroption @server=N'MyLinkedServer', @optname=N'use remote collation', @optvalue=N'true'
EXEC master.dbo.sp_serveroption @server=N'MyLinkedServer', @optname=N'remote proc transaction promotion', @optvalue=N'true'
Run Code Online (Sandbox Code Playgroud)

链接服务器已成功创建,我可以在SQL Server中查询Mysql表.

询问

我跑的时候

INSERT INTO MyLinkedServer...Table1(ID,Code) SELECT 1,'Code1'
Run Code Online (Sandbox Code Playgroud)

记录已插入.但是,当我启动一个事务并运行时INSERT,我收到一个错误:

BEGIN TRAN
INSERT INTO MyLinkedServer...Table1(ID,Code) SELECT 1,'Code1'
COMMIT
Run Code Online (Sandbox Code Playgroud)

错误:

链接服务器"MyLinkedServer"的OLE DB提供程序"MSDASQL"返回消息"[MySQL] [ODBC 5.3(a)驱动程序]不支持可选功能".消息7391,级别16,状态2,行8无法执行操作,因为链接服务器"MyLinkedServer"的OLE DB提供程序"MSDASQL"无法启动分布式事务.

到目前为止我尝试过的.

  1. 在MSDTC中启用XA事务 …

mysql sql-server linked-server distributed-transactions

7
推荐指数
1
解决办法
7153
查看次数

MSDTC 日志文件 (MSDTC.LOG) 如何工作?

最近遇到一个错误: Microsoft 分布式事务协调器 (MS DTC) 已取消分布式事务

在论坛的一个回复中提到,原因之一可能是——

已超出 MS DTC 日志文件可容纳的最大活动事务数。如果您希望启动更多并发事务,则必须增加 MS DTC 日志文件的大小。

所以,我很好奇 MS DTC 的日志记录是如何工作的。
1. 是每个分布式事务并且每次事务结束时都会清理文件吗?
或者
2. 是否所有事务日志都会持续存在并且文件会随着时间的推移而增长?(直到达到为 MSDTC.log 文件设置的最大文件大小限制)

我将文件容量从 4MB 更改为 16MB,发现文件大小立即增加,所以我猜测是 1。

但如果有人能详细解释这种“日志记录”是如何工作的,那就太好了。

注意:我对 MS DTC 的工作原理有一定的了解。

sql msdtc distributed-transactions

6
推荐指数
0
解决办法
2457
查看次数

跨 Spring Web 应用程序的分布式事务

想象一个 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 操作。

database spring transactions jta distributed-transactions

6
推荐指数
1
解决办法
1549
查看次数

为什么两阶段提交不适用于微服务架构?

我读了一篇文章说:

我们无法在分布式环境中实现传统的交易系统,如微服务中的两阶段提交。

我完全同意这一点。

但是,如果有人可以解释此问题的确切原因,那就太好了。如果我要通过微服务实现两阶段提交,将会遇到什么问题?

提前致谢

java 2phase-commit distributed-system distributed-transactions microservices

6
推荐指数
2
解决办法
1110
查看次数

微服务之间的原子操作

我需要在基于 Spring Boot 的微服务应用程序中解决原子操作。您可以想象 2 个微服务,如图所示。

在此输入图像描述

一项服务用于保存用户权限和凭据作为身份提供者,另一项服务作为应用程序中用于与订单、联系人、地址等配对的用户帐户。

当用户创建新帐户时,我需要创建用于商业目的的用户和用于授权的用户身份。这两个操作都应该作为一个原子操作来执行。这意味着如果失败,机器人必须失败并回滚。如果没有业务用户对象,则无法保存用户凭据。您能告诉我解决此问题的最佳方法是什么或应该采取哪些步骤吗?

我的第一个想法是使用 Feign 的 RestTemplate 调用另一个服务,但我不知道如果第二次失败如何回滚操作。谢谢你的建议。

spring distributed-transactions spring-boot microservices spring-cloud

6
推荐指数
1
解决办法
1108
查看次数