Questions tagged «distributed-system»

2
如果事务永远不会跨越多个对象,那么每个对象的乐观并发性是否意味着可串行化?
给定一个提供以下功能的系统: 每个对象的乐观并发控制/版本控制(使用CAS-Check-and-Set) 不需要跨多个对象的事务。 快照隔离 该系统是否可序列化? 从快照隔离 在写偏斜异常中,两个事务(T1和T2)同时读取重叠的数据集(例如值V1和V2),并发进行不相交的更新(例如T1更新V1,T2更新V2),最后并发提交,都没有看到对方执行的更新。如果系统可序列化,那么这种异常将是不可能的,因为T1或T2都必须“首先”发生,而另一个则可见。相反,快照隔离允许写偏斜异常。 举一个具体的例子,假设V1和V2是一个人Phil持有的两个天平。银行将允许V1或V2出现赤字,前提是两者中所持的总和决不为负(即V1 + V2≥0)。目前两个余额均为$ 100。Phil同时发起了两个交易,T1从V1提取200美元,T2从V2提取200美元。 基于此,似乎存在写偏斜的可能性是保证快照隔离不可序列化的系统的唯一原因。 但是,在不允许事务跨越多个对象的系统中(在上面的示例V1和V2中),似乎不可能发生写偏斜。 因此,上述系统是可序列化的。它是否正确?

2
如何使用多个应用程序实例安全地运行数据库迁移?
我们有一个应用程序,它既有快速的迁移(<1秒)又有缓慢的数据库迁移(> 30秒)。现在,我们正在将数据库迁移作为CI的一部分来运行,但是我们的CI工具必须知道我们的应用程序(在多个环境中)的所有数据库连接字符串,这并不理想。我们希望更改此过程,以便应用程序在启动时运行自己的数据库迁移。 情况如下: 我们有此应用程序的多个实例-在生产中大约有5个实例。我们称他们为node1, ..., node5。每个应用程序都连接到一个SQL Server实例,并且我们不使用滚动部署(就我所知,所有应用程序都是同时部署的) 问题:说我们的迁移时间很长。在这种情况下,先node1启动,然后开始执行迁移。现在node4开始,并且长时间运行的迁移尚未完成,因此node4也开始运行迁移->可能的数据损坏?您将如何预防该问题,或者该问题甚至足够重要而值得担心? 我当时正在考虑使用分布式锁(使用etcd或类似的方法)解决此问题。基本上,所有应用程序都尝试获取锁,只有其中一个可以获取并运行迁移,然后解锁。当其余的应用程序启动并进入关键部分时,所有迁移都已运行,因此迁移脚本将退出。 但是,我的直觉是说:“这太过分了,必须有一个更简单的解决方案。”因此,我想问一下这里是否有其他更好的主意。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.