默认情况下禁用MSDTC(Windows 2003 - 以后),我想为我正在开发的应用程序启用它,该应用程序需要来自.Net C#的分布式事务.
我不相信启用它有任何安全问题,但是,是否知道启用DTC的任何安全问题?
干杯
奥利
我正在学习NServiceBus和MSMQ.有人告诉我,MSMQ中的事务队列很糟糕,使用它们对性能非常不利.有谁知道为什么?我猜这是来自它使用DTC的概念,每个人都知道DTC不是真正的可扩展解决方案.在我看来,MSMQ与NServiceBus并没有那么糟糕有几个原因,但我不知道我是否理解它是如何完全运作的.从逻辑上看,我可以想到NServiceBus可能会使用交易的3个地方,以确保交付:
任何人都可以直接告诉我NServiceBus如何做到这一点?
我已经尝试了将近一周的时间来分发交易.我在MSSQL上有一些尝试从MySQL中选择数据的程序.我需要在一个(!)事务中执行此操作.当时我已经建立了与OpenLink的单层MySQL驱动程序,其中规定我,XA交易成功运行(有配置ODBC连接后集成测试按钮)在MSSQL ODBC连接.然后我通过MSDASQL在MSSQL中建立了一个链接服务器到这个ODBC连接,但是在做的时候
begin distributed transaction
select * from optin..lu_source_proc
select * from openquery(optinxa, 'SELECT * FROM tbl_source_proc')
commit transaction
Run Code Online (Sandbox Code Playgroud)
我收到错误,在实际交易中没有进一步的交易.(Der OLE DB-Anbieter "MSDASQL" für den Verbindungsserver "optinxa" hat die Meldung "Es können keine weiteren Transaktionen in dieser Sitzung gestartet werden." zurückgeben.)
另一个测试:
set transaction isolation level serializable
begin transaction
select * from optin..lu_source_proc
select * from openquery(optinxa, 'SELECT * FROM tbl_source_proc')
commit transaction
Run Code Online (Sandbox Code Playgroud)
结果Der OLE DB-Anbieter "MSDASQL" für den Verbindungsserver "optinxa" hat die Meldung "[OpenLink][ODBC][Driver]Driver does not …
mysql sql-server odbc sql-server-2005 distributed-transactions
我们在weblogic服务器v10.3.2.0中面临以下异常。我们正在使用JRockit JRE 6.0。
每个服务器请求中都涉及6-7个XA数据源。当在最后一个数据源上开始处理时,我们将遇到此异常。
请有人指教。
java.sql.SQLException: Unexpected exception while enlisting XAConnection
java.sql.SQLException: Transaction rolled back: setRollbackOnly called on transaction
at weblogic.jdbc.jta.DataSource.enlist(DataSource.java:1616)
at weblogic.jdbc.jta.DataSource.refreshXAConnAndEnlist(DataSource.java:1503)
at weblogic.jdbc.jta.DataSource.getConnection(DataSource.java:446)
at weblogic.jdbc.jta.DataSource.connect(DataSource.java:403)
at weblogic.jdbc.common.internal.RmiDataSource.getConnection(RmiDataSource.java:364)
at com.ibatis.sqlmap.engine.transaction.jta.JtaTransaction.init(JtaTransaction.java:68)
at com.ibatis.sqlmap.engine.transaction.jta.JtaTransaction.getConnection(JtaTransaction.java:131)
at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryForObject(MappedStatement.java:120)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:518)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:493)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:106)
at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject(SqlMapClientImpl.java:82)
Run Code Online (Sandbox Code Playgroud) 我正在维基百科上阅读3阶段提交协议(http://en.wikipedia.org/wiki/Three-phase_commit_protocol),这是一个让我想到3PC失败的场景:
假设有两个参与者A和B以及一个协调员C:
1)C向A发送预先提交消息,在向B发送预先提交消息之前,A和C同时发生故障.2)事务现在重新启动,B最终中止,因为没有来自A的回复.3)A提交事务,因为它已经获得了预先提交消息.
这也不是3PC应该解决的2PC中的原始问题吗?3PC如何解决问题?我错过了什么 谢谢.
根据Hibernate文档,在JTA环境中,默认的连接释放模式是after_statement,这意味着在每个语句之后释放hibernate逻辑连接.
释放逻辑连接后,将调用Connection close()方法,并从事务管理器中取消列出当前资源.
根据RedHat 交易开发者指南:
"delistResource方法用于将指定资源与目标对象中的事务上下文分离.应用程序服务器使用两个参数调用该方法:
An XAResources object, which represents the resource.
A flag to indicate whether the operation is due to the transaction being suspended (TMSUSPEND), a portion of the work has failed (TMFAIL), or a normal resource release by the application (TMSUCCESS)."
Run Code Online (Sandbox Code Playgroud)
由于Bitronix使用TMSUCCESS:
currentTransaction.delistResource(xaResourceHolderState.getXAResource(), XAResource.TMSUCCESS);
Run Code Online (Sandbox Code Playgroud)
这意味着连接与当前事务分支取消关联,有时您可能最终为同一资源适配器争用2个不同的连接.
我认为保持连接的次数与事务一样多是一个更好的选择,因为我们通常每个事务执行多个语句.所以after_transaction释放模式听起来更有吸引力.
使用Bitronix,after_transaction释放模式更合适吗?有没有人在生产环境中体验过它?
关于SO的第一个问题(真的???),请跟我一起请:)
我们正在使用事件采购来构建解决方案.我们的一些业务流程将长期运行,因此我们计划使用sagas将命令编排到多个聚合根.
根据我的理解,如果一个saga发出的命令失败,那么saga将负责向所有先前调用的聚合根发出补偿命令.
如果聚合根的状态在参与saga 之后在外部(即由其他进程/用户)发生变异,但是在 saga失败并向该聚合根发出补偿命令之前,应该采取什么行动呢?
换句话说,如何尝试补偿某个聚合根的事件流中的最后一个事件(在EventStore语言中说话)?
domain-driven-design distributed-transactions cqrs event-sourcing
两阶段提交被称为“原子提交协议”。我希望这意味着所有客户从事务提交之前或提交之后都可以看到世界的状态,而没有中间状态。似乎它可以进入一种状态,其中事务已部分提交,客户看到不一致的数据,从而破坏了原子性。
考虑两个数据库A和B的情况。如果在提交阶段A提交之后但B提交之前存在分区,则事务将部分提交。查询A和B的用户将看不到一致的数据-事务已在A上提交,但B具有来自提交之前的数据。
ACID的“一致”部分似乎也已损坏-查询A和B的客户端可能会看到违反业务规则的数据。
我的想法是,当分区结束并且事务管理器指示B提交时,系统最终将能够从中恢复。但是,与此同时,系统处于不一致的“部分提交”状态。难道不是要防止这种情况的全部原因吗?通过恢复时间一致性,损坏可能已经造成。
当两阶段提交被称为原子时,指的是什么属性?
考虑具有两个实体的应用程序:
User (包含基本用户数据,例如名称)Passport (包含身份验证凭据,即密码)还有两个内部微服务:
UserService (负责创建和管理用户及其基本数据)AuthService (负责用户身份验证和密码处理)该User实体属于UserService和Passport实体属于AuthService.
这两个服务应该分开,因为它们解决了截然不同的任务:配置文件数据和身份验证.
另外,请考虑我们有一个包含三个字段的注册表:
此表单将触发GatewayService对该应用程序的HTTP请求,该请求拦截对应用程序的所有请求并将它们路由到内部微服务(或组合/聚合它们).
现在,当网关服务收到包含所有表单数据的请求时,它需要执行以下操作:
UserService创建新用户(它将以生成的方式响应userId).AuthService为新创建的用户创建护照.它将需要userId步骤#1中收到的和password原始请求中的字段.这看起来非常简单,但如果AuthService在步骤#2中不可用会发生什么?我们需要以某种方式分离这些请求!
经典方法是使用最终一致性并Passport通过异步调用创建实体(我们可以将此请求放入队列并在单独的服务中处理它).为了做到这一点,我们将向AuthService传递userId和password向它发送异步请求,而不是步骤#2,因此步骤#1将立即返回对客户端的响应.
但是,如果password字段格式不正确(打破验证规则)怎么办?验证逻辑仅出现在AuthService,因此我们无法知道密码是否正确,直到调用它为止.现在,请求是异步处理的,因此我们无法回复用户并告诉他更正密码.
那么,您如何正确处理微服务应用程序的分布式复合请求中的验证?
天真的解决方案是将验证逻辑移到GatewayService自身,但这是一个糟糕的主意,因为它会使它变胖并且会泄露业务逻辑AuthService.
另一个想法是提供一种额外的密码验证方法,并在步骤#1和#2之前调用它.它看起来像一个可行的解决方案,但它将迫使我们为我们的微服务中的每个业务方法提供两种方法,一种用于事先验证,一种用于实际操作.此外,验证和操作之间存在时间空间,因此在实际执行操作时,较早的正确值可能会变得不正确.
我们可以将表单拆分为两个以避免复合请求,并在询问个人数据并为他创建帐户后询问用户密码.但是,这可能会导致安全问题,其中一些其他可能猜到下一个用户的用户可以拦截用户帐户userId.我们可以使用一些额外的安全令牌,但它会为服务引入奇怪的功能,并使整个设置更加复杂.
此外,这种方法看起来像是试图逃避问题,您不能总是避免复合请求.
我们可以使用全面的分布式事务,例如2PC,但它会使系统变得非常复杂,并且首先会减少MSA的使用.
最后的想法是将这两种服务合并在一起,但在微服务架构中这样做是没有意义的.
architecture software-design distributed-transactions microservices
我有2个微服务S1和S2。S1调用S2先更新一个数据,然后S1插入另一个数据,但是让我们考虑S1失败,然后我们需要回滚更新的数据,S2否则我们将处于不一致状态。
我也经历了Saga模式。它将满足这种不一致的情况
有人可以为此提出任何更好的解决方案吗?
transactions ×3
acid ×1
architecture ×1
atomic ×1
atomicity ×1
bitronix ×1
c# ×1
cqrs ×1
hibernate ×1
java ×1
jdbc ×1
jrockit ×1
msdtc ×1
mysql ×1
nservicebus ×1
odbc ×1
saga ×1
sql-server ×1
xa ×1