Google cloud platform 扳手中的下一个数字

Google cloud platform 扳手中的下一个数字,google-cloud-platform,google-cloud-spanner,Google Cloud Platform,Google Cloud Spanner,在扳手中实现下一个数字例程的最佳方法是什么 背景: 我们需要为分配生成序列号。多个并发用户可以请求下一个号码。我们希望确保没有用户收到相同的号码 目前的设计是有一个表,其中包含最后使用的数字。此列将被读取、递增一个数量,然后写出。事务中的读取是否会锁定正在读取的行,直到事务完成?在扳手中实现下一个数字例程的最佳方法是什么 正如您在任何数据库中保证读写事务是独立的一样,原子的 事务中的读取是否会锁定正在读取的行,直到事务完成 锁定读写。这种类型的事务是唯一支持将数据写入云扳手的事务类型 属性 Cl

在扳手中实现下一个数字例程的最佳方法是什么

背景: 我们需要为分配生成序列号。多个并发用户可以请求下一个号码。我们希望确保没有用户收到相同的号码

目前的设计是有一个表,其中包含最后使用的数字。此列将被读取、递增一个数量,然后写出。事务中的读取是否会锁定正在读取的行,直到事务完成?

在扳手中实现下一个数字例程的最佳方法是什么

正如您在任何数据库中保证读写事务是独立的一样,原子的

事务中的读取是否会锁定正在读取的行,直到事务完成

锁定读写。这种类型的事务是唯一支持将数据写入云扳手的事务类型

属性 Cloud Spaner中的读写事务在单个逻辑时间点以原子方式执行一组读写操作

原子性、一致性、耐久性除了隔离 属性,云扳手提供原子性(如果在 事务提交,它们都提交)、一致性(数据库) 在事务处理后保持一致状态)和持久性 (提交的数据保持提交状态。)

这是直接引自

性能>锁定

Cloud Panner允许多个客户端同时与同一数据库交互。为了确保 多个并发事务的一致性,云扳手使用 共享锁和排他锁的组合,以控制对 数据。当您作为事务的一部分执行读取时,云 扳手获取共享读锁,这允许其他读操作停止 访问数据,直到事务准备好提交为止。当你的 事务正在提交,并且正在应用写操作 事务尝试升级到独占锁。它阻碍了新的发展 数据上的共享读取锁,等待现有的共享读取锁打开 清除,然后为数据的独占访问设置独占锁


所以。。。我认为,如果您像本文档末尾的读写示例那样进行操作,您可以完全冷静地对待您的担忧。

在处理Cloud Panner中的序列时要非常小心,因为这可能是一个可能导致热点(即性能问题)的问题。你真的确定你绝对需要序列号吗?如果您只需要为人员分配唯一标识符,那么有一些方法可以做到这一点,而无需按顺序分配。例如,请参见有关设计主键的回答

在问题中的应用程序描述中,您说多个并发用户可能正在请求下一个号码。此值(
next_number
)在整个应用程序中是否全局唯一?如果是这样,那么这个值将成为一个热点,并可能限制数据库(和应用程序)的可伸缩性,因为它意味着数据库的性能将受到单台计算机处理这一行上事务的速度的限制。您是否可以为数据库中的不同用户/实体指定不同的
下一个\u编号
?例如,每个用户是否都有一个
next\u number
值?或者,您可以“切分”您的应用程序,以便在
下一个\u number
中有数百或数千个值?例如

CREATE TABLE MyTable(
  ShardNum INT64 NOT NULL,
  NextNumber INT64 NOT NULL
  .. etc..
) PRIMARY KEY (ShardNum, NextNumber)

请注意,我只是在讨论应用程序的性能。就正确性而言(即确保
next_value
是唯一的),云扳手事务确保两个读卡器不会读取
next_number
的相同值(或者,更准确地说,两个读卡器都不允许提交)。因此,只要在读-修改-提交流中使用读-写事务,就可以了(从正确性的角度来看)。

这个问题涉及面很广:描述了问题,但没有描述到目前为止为解决问题所做的工作。看起来它只是在寻求建议,而没有阅读任何文档。顺便提一下Google Cloud Paner中只有一种事务,它是原子的,你也可以在相同的文档中看到。我编辑了这个问题以帮助当前的计划和设计。这方面的文件不准确。