标签: distributed-transactions

TransactionScope真正做了什么

调查一下,我验证了例如在下面的场景中没有回滚值"myInt"

int myInt = 10;
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew))
{
    myInt=20;
    Transaction t = Transaction.Current;

    t.Rollback();
}
Run Code Online (Sandbox Code Playgroud)

所以它让我想到"TransactionScope是否只回滚与数据库相关的活动?或者事务可以管理其他事情,我不知道那些?"

c# transactions transactionscope distributed-transactions

10
推荐指数
1
解决办法
5442
查看次数

Spring/RabbitMQ:事务管理

为了简化我的问题,我有

App1与@Transactionnal方法createUser():

  • 在数据库中插入新用户
  • 在RabbitMQ中添加异步消息,以便用户收到通知邮件
  • (可能是一些额外的代码,但不多)

App2与RabbitMQ消息消失

  • 实时消除邮件队列中的消息
  • 读取数据库中的邮件数据
  • 发邮件

问题是,有时,App2尝试在App1上提交事务之前使用RabbitMQ消息.这意味着App2无法读取数据库上的邮件数据,因为尚未创建用户.

一些解决方案可能是:

  • 在App2上使用READ_UNCOMMITED隔离级别
  • 在RabbitMQ消息传递中添加一些延迟(或在消费者上添加一些RetryTemplate)
  • 改变我们发送电子邮件的方式......

我已经看到Spring中有一个RabbitTransactionManager,但我无法理解它应该如何工作.事务处理内容似乎总是有点难以理解,文档也没有那么多帮助.


有没有办法做这样的事情?

  • 在@Transactionnal方法中向RabbitMQ队列添加消息
  • 当事务结束时,消息将提交到队列,并且更改将提交到数据库
  • 这样在db事务结束之前无法消除消息

怎么样?如果我发送同步RabbitMQ消息而不是异步消息,那么可以期待什么呢?它会阻止等待响应的线程吗?因为我们确实为不同的用例发送同步和异步消息.

spring transactions distributed-transactions rabbitmq

10
推荐指数
1
解决办法
1820
查看次数

为什么Paxos领袖选举没有使用Paxos?

以下问题旨在认真而不是轻浮.我缺乏分布式系统的经验,但我确实理解Basic Paxos如何工作以及为什么领导者选择是有用的.不幸的是,我的理解还不够深入,无法理解下面的问题.

关于交易提交的共识,第8页(链接PDF的第11页)中,我们有以下声明.

选择独特的领导者等同于解决共识问题.

如果这个陈述是真的,并且Paxos的目的是达成共识,为什么Paxos本身并不常用于领导者选举?

此外,同一篇论文赞同领导者选举算法描述的稳定领袖选举论文.

如果这两个问题是等价的,并且同一篇论文支持不同的领导者选举算法,为什么不使用其他算法来解决一般共识问题而不是Paxos

distributed protocols distributed-transactions consensus paxos

10
推荐指数
1
解决办法
4127
查看次数

找不到配置绑定扩展

我正在尝试运行将参与分布式事务的WCF Web服务.我一直收到以下错误消息......

找不到配置绑定扩展'system.serviceModel/bindings/myBinding'.验证此绑定扩展是否已在system.serviceModel/extensions/bindingExtensions中正确注册,并且拼写正确

这是web.config

  <system.serviceModel>
<services>
  <service name = "DistServiceX">
    <endpoint
       address=""
       binding="myBinding"
       contract="IDistService"
     />
  </service>
</services>
<bindings>
  <wsHttpBinding>
    <binding
      name="myBinding" 
      transactionFlow="true"
      />
  </wsHttpBinding>
</bindings>

<behaviors>
  <serviceBehaviors>
    <behavior name="">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
Run Code Online (Sandbox Code Playgroud)

有人能看出这有什么问题吗?这让我疯狂!

谢谢

皮特

wcf distributed-transactions

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

如何学习设计高度交易系统?

在我的职业生涯中,我一直致力于数据分析,BI工具等.我工作的大多数应用程序都是主要的只读应用程序.虽然我也曾在简单的CRUD应用程序上工作,但没有什么特别的交易.作为一名软件工程师,我觉得如果我不知道如何设计高度交易系统和数据库,如亚马逊,航空公司系统等的工作方式,我的学习中就会出现空白.我想请社区人士就这个问题提出一些资源,书籍或简单项目.在教授必要的理论的同时可以采用实践方法的东西.我知道这是一个主观问题,但我可以将最有用的答案标记为绿色.期待您的建议并感谢您的期待.

distributed database-design transactions high-availability distributed-transactions

9
推荐指数
1
解决办法
1297
查看次数

查询链接服务器上的全局临时表

我已经看到了关于如何在两个不同的SQL服务器上查询两个不同表的所有引用,我理解它是如何实现的.但是,该命令似乎不适用于使用##.创建的临时表.

如果我在一台服务器上编写一个连接,并且它在该服务器上引用一个临时表,在另一台服务器上引用一个临时表,则SQL Server会假定因为##它在命令中,它会自动查看本地服务器tempdb,而不是远程服务器一.我此时也无法使用OPENROWSET,因为该功能已被禁用,我必须获得批准才能重新启用.

所以我的问题是有一种方法可以重新配置这个命令以识别tempdb要查看的内容吗?

SELECT * 
FROM (##mytemptable1 Demog 
INNER JOIN MyServer.tempdb.dbo.##mytemptable2 PeakInfo ON (Demog.SAMPLE_NO = PeakInfo.SampleNum)  AND  (Demog.JOB_NO = PeakInfo.JobNum) )
ORDER BY PeakInfo.JobNum, PeakInfo.SampleNum,   PeakInfo.Replicate ,PeakInfo.Reinjection ,PeakInfo.PeakNameCustSort
Run Code Online (Sandbox Code Playgroud)

sql-server distributed-transactions sql-server-2008

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

为什么Azure数据库在事务中表现更好

我们决定对Azure数据库使用微操作.由于我们的业务只需要"插入"和"选择",我们决定禁止所有代码管理SqlTransaction(没有数据的并发问题).

然后,我们注意到我们的Azure数据库实例反应非常缓慢." rpc completed "事件发生的延迟是运行简单sql语句所需时间的数百倍.

接下来,我们使用EF6对代码进行基准测试,我们发现服务器响应非常快.当EF6实现内置事务时,我们决定恢复SqlTransaction微观orm上的(ReadCommited),我们发现一切都很好.

Azure数据库是否需要显式SqlTransaction(由代码管理)?SqlTransactionAzure数据库的表现如何影响?为什么这样实现?

编辑:我将发布一些关于我们收集痕迹的方式的更准确的信息.我们的Azure事件日志有时以纳秒表示,有时以毫秒为单位.看起来很奇怪.

ado.net distributed-transactions micro-orm entity-framework-6 azure-sql-database

8
推荐指数
1
解决办法
215
查看次数

Atomikos事务日志com.atomikos.icatch.enable_logging = false

我想了解如果我设置了分布式事务功能是否适用于我的应用程序 com.atomikos.icatch.enable_logging=false

  • 我是否正确理解事务恢复与发生崩溃的情况相关,我们希望完全重新启动相同的事务.
  • 恢复是否在同一个分布式事务中工作?
  • 我的应用程序容忍失败,因为失败总是可以从一开始就用新事务重新启动.这是否意味着在我的情况下可以设置com.atomikos.icatch.enable_logging=false
  • com.atomikos.icatch.enable_logging=false如果并非所有分布式事务的参与者都已提交,则可能导致数据库的状态不一致?

更新 我在这个问题之后被触发,以便更多地了解我在这里描述的分布式事务的内部结构: 如何调整分布式(XA)事务的性能?

java database xa distributed-transactions atomikos

8
推荐指数
1
解决办法
695
查看次数

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
查看次数