如何在Spanner中的两阶段提交中避免阻塞?

时间:2016-02-14 06:09:53

标签: google-cloud-platform google-cloud-spanner

我已经读过两阶段提交遭遇阻塞问题。

但在Google的Spanner Paper中,他们曾写过Google在Spanner中使用两阶段提交。

我的问题是:如何在Spanner中解决阻塞问题?

2 个答案:

答案 0 :(得分:2)

“一些作者声称一般的两阶段提交太昂贵而无法支持,因为它带来了性能或可用性问题[9,10,19]。我们认为应用程序员更好处理由于过度使用事务而导致的性能问题,而不是总是在缺乏事务的情况下进行编码。在Paxos上运行两阶段提交可以缓解可用性问题。“

如果一个节点关闭,Paxos可以处理从其他活动节点读取或写入事务。

答案 1 :(得分:1)

Spanner现已在Google Cloud Platform上提供。以下是一些关于2PC和锁定的附加文档。

https://cloud.google.com/spanner/docs/transactions

==

Cloud Spanner允许多个客户端同时与同一个数据库进行交互。为了确保多个并发事务的一致性,Cloud Spanner使用共享锁和独占锁的组合来控制对数据的访问。当您作为事务的一部分执行读取时,Cloud Spanner会获取共享读锁,这允许其他读取仍然可以访问数据,直到您的事务准备好提交。当您的事务正在提交并正在应用写入时,事务会尝试升级到独占锁。它阻止数据上的新共享读锁,等待现有的共享读锁清除,然后放置一个独占锁以独占访问数据。

关于锁的说明:

以行和列的粒度进行锁定。如果事务T1已锁定行“foo”的列“A”,并且事务T2想要写行“foo”的列“B”,则不存在冲突。 写入不读取正在写入的数据的数据项(也称为“盲写”)不会与同一项的其他盲写者冲突(每次写入的提交时间戳决定了它的应用顺序)数据库)。这样做的结果是,如果您已经阅读了正在编写的数据,Cloud Spanner只需要升级到独占锁。否则Cloud Spanner使用称为writer共享锁的共享锁。

==