根据 MongoDB 文档,事务仅适用于副本集,不适用于单个节点。为什么有这样的要求呢?在单个节点上进行交易不是比在分布式系统上更容易吗?
例如,如果我们有时间表 S1 :
r1[C] r2[A] r1[C] w3[B] w2[B] w1[C] commit1 r2[A] commit2 w3[B] commit3
Run Code Online (Sandbox Code Playgroud)
我们知道这个调度不是冲突可串行化的,因此它不能来自两阶段锁定,但它是视图可串行化的。然而,如果我们想将严格的 2PL 应用于上述时间表,答案是:
x1[C] r1[C] s2[A] r2[A] r1[C] x3[B] w3[B] T2-waits-for-Xlock-on-B w1[C] commit1 u1[C] w3[B] commit3 u3[B] x2[B] w2[B] r2[A] commit2 u2[A] u2[B]其中 u1[C] 表示 T1 释放对象 C 上的锁。在这种情况下,B 上的最后一次写入将由 T2 完成,这与原始调度 S1 不同。
或者严格 2PL 的正确应用如下:
x1[C] r1[C] s2[A] r2[A] r1[C] x3[B] w3[B] T2-waits-for-Xlock-on-B w1[C] commit1 u1[C] T3-waits-for-T2-to-take-lock-on-B-in-order-to-execute-w2[B]-first在这种情况下,每个事务的读写顺序被保留,但会发生死锁。
总结我的问题:在附表 S1 中应用 2 相锁定(严格)的正确方法是什么?
每次我们应用两相锁定时,是否必须保持命令顺序与原始计划相同?
我目前正在研究二阶段和三阶段提交。
3PC协议试图通过添加一个额外的阶段preCommit来消除2PC协议\xe2\x80\x99s的系统阻塞问题。正如这里提到的
根据这篇文章,如果协调器在任何时候崩溃,恢复节点可以接管事务并从任何剩余副本查询状态。例如,如果任何剩余副本回复恢复节点它处于预提交状态,则恢复节点将知道失败的协调器已发送预提交消息,并且所有副本已同意提交。
我的问题是,为什么两阶段提交不能做同样的事情?当协调器发生故障时,恢复节点会查询那些剩余的节点并查看其中是否有任何节点已经处于提交阶段?
我已阅读服务器帖子,但仍然不知道三阶段提交试图解决的确切问题是什么以及如何解决?
\n请帮忙!
\n我有一个分布式事务上下文使用ServiceDomain.在其中,我打开一个带有连接字符串指定的SQL连接Enlist=false,这样它就不会自动登记在事务中.然后,如果我在分布式事务中手动登记连接EnlistDistributedTransaction,则连接不会关闭,这可以以以下结尾InvalidOperationException:
超时已过期.从池中获取连接之前经过的超时时间.这可能是因为所有池连接都在使用中并且达到了最大池大小.
请尝试以下方法:
try
{
var configuration = new ServiceConfig
{
Transaction = TransactionOption.Required,
TransactionTimeout = 1000
};
ServiceDomain.Enter(configuration);
for (var i = 0; i < 500; ++i)
{
Console.WriteLine(i);
using (var conn = new SqlConnection("Data Source=localhost;Initial Catalog=dotest;Integrated Security=SSPI;Enlist=False;"))
{
conn.Open();
if (i % 2 == 0) conn.EnlistDistributedTransaction((ITransaction) ContextUtil.Transaction);
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "INSERT INTO [Test]([ID]) VALUES(@num)";
cmd.Parameters.AddWithValue("@num", i);
cmd.ExecuteNonQuery();
}
}
}
ContextUtil.SetAbort();
}
finally …Run Code Online (Sandbox Code Playgroud) .net sql-server connection-string sqlconnection distributed-transactions
我正在阅读"Java Persistence with Hibernate"一书并被困在第494页.我们确实扩展了一个对话,hibernate.current_session_context_class to managed;这意味着现在我不能jta (or javax.jta.UserTransaction)在我的方法中使用' '
当我查看第494页的拦截器代码时,这种假设变得越来越强烈.在拦截器中,我们称之为' session.beginTransaction',这意味着我们正在使用Hibernate Transaction API来控制事务.
这是否意味着,我的实体不能使用UserTransaction.begin()/ commit()来控制事务?
我告诉这个是因为在本书的某处我甚至读到当你使用UserTransaction来控制事务边界时,你不应该使用Hibernate Transaction API吗?
这里需要一些帮助.
我有一个应用程序,可以交互多个数据库和一些自定义服务.对于某些操作,我需要类似事务的行为,其中一组更改要么跨所有数据库/服务提交,要么在发生错误时回滚.
X/Open组和Java JTA的XA标准似乎使用两阶段提交过程来解决这个问题.一些数据库(mySQL,Postgres,Oracle)支持这些接口,但我觉得它们不经常使用或不受欢迎.真的吗?如果是这样,为什么?
我知道在mySQL上有一些与XA有关的复制相关问题.此外,XA事务可能会明显变慢.还有其他原因导致XA不受欢迎/不常见吗?
从JTA规范我明白它只为调用线程工作(或支持)分布式事务.这是否意味着不能跨多个线程跨越事务?或者它取决于实施?
任何JTA实现是否支持跨线程的XA?
谢谢!
所有事务管理器(Atomikos,Bitronix,IBM WebSphere TM等)都将一些"事务日志"保存到文件系统的"tranlogs"文件夹中.
当一些可怕的事情发生并且服务器崩溃时,有时变更会被破坏.它们需要一些手动恢复程序.
我被告知,通过简单地清除已损坏的tranlogs文件夹,我冒着参与交易的资源状态不一致的风险.
作为一个"愚蠢"的开发者,我对简单的概念感到更舒服.我想认为分布式事务管理应该与常规事务管理相似:
问题
为什么我不这样想?2PC有什么这么复杂的?
当我清除损坏的tranlogs时,确切的风险是什么?
如果我错了,我真的需要所有混乱的2PC文件系统状态.TX经理是否能够以简单而丑陋的方式实际破坏存储状态这一事实,您是否感到恶心?
database oracle transactions 2phase-commit distributed-transactions
任何人都可以告诉我如何在postgresql中处理分布式事务,这也称为"XA"?有没有关于它的资源?非常感谢任何答案.
我有两个mico-serives A和B,它们连接到单独的数据库,从Mico-serives A我需要在同一个转换中持久保存(保存)A和B的对象如何实现这一点.
我正在使用带有netflix-oss的Spring微服务.请给出关于执行2阶段提交的最佳方法的建议.
2phase-commit distributed-transactions spring-boot microservices
jta ×3
transactions ×3
xa ×3
postgresql ×2
.net ×1
atomikos ×1
database ×1
hibernate ×1
locking ×1
mongodb ×1
mysql ×1
oracle ×1
spring-boot ×1
sql-server ×1