1

我读过两阶段提交遇到阻塞问题。

但是在 Google 的 Spanner 论文中,他们写道 Google 在 Spanner 中使用了两阶段提交。

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

4

2 回答 2

2

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

如果一个节点宕机,Paxos 可以处理来自其他活动节点的读取或写入事务。

于 2016-08-04T06:28:43.903 回答
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 使用称为写入器共享锁的共享锁。

==

于 2017-02-21T17:19:09.873 回答