Cloud Spanner 中存在另一个 table 的记录时如何中止删除记录?
How to abort deleting record when another table's record exists in Cloud Spanner?
我正在使用 Cloud Spanner 和下面两个表。
singers
singer_id
albums
album_id
singer_id
我需要使用 Go 和 Spanner 实现两个 API DeleteSinger
和 CreateAlbum
。
如果目标歌手的专辑存在则无法删除歌手,如果专辑 singer_id 的歌手不存在则无法创建专辑。相册也可以删除。
我曾经在 MySQL 中通过 SELECT FOR UPDATE
获取 Singer 的独占锁来实现这种情况,但我如何在 Spanner 中管理它?
使用ReadWriteTransaction
通过在创建专辑时读取和更新没有值更新的歌手来获得歌手的独占锁是否好?
Cloud Spanner 是一个高度一致的数据库,它会自动为您处理这个问题,而无需显式锁定任何内容。如果您开始一个 read/write 事务,并且在该事务中能够 select 一个 Singer,那么 Cloud Spanner 保证您可以在事务的剩余部分安全地引用该 Singer。
换句话说:在您的 read/write 交易中为歌手执行 SELECT
而不是 SELECT FOR UPDATE
就足够了相同的行为。
Cloud Spanner 支持外键,允许您在 table 之间定义 relationships/constraints。您可以考虑定义外键约束以确保专辑中的所有行都具有歌手 table 中存在的有效 singer_id。有关详细信息,请参阅 https://cloud.google.com/spanner/docs/foreign-keys/overview
我正在使用 Cloud Spanner 和下面两个表。
singers singer_id
albums album_id singer_id
我需要使用 Go 和 Spanner 实现两个 API DeleteSinger
和 CreateAlbum
。
如果目标歌手的专辑存在则无法删除歌手,如果专辑 singer_id 的歌手不存在则无法创建专辑。相册也可以删除。
我曾经在 MySQL 中通过 SELECT FOR UPDATE
获取 Singer 的独占锁来实现这种情况,但我如何在 Spanner 中管理它?
使用ReadWriteTransaction
通过在创建专辑时读取和更新没有值更新的歌手来获得歌手的独占锁是否好?
Cloud Spanner 是一个高度一致的数据库,它会自动为您处理这个问题,而无需显式锁定任何内容。如果您开始一个 read/write 事务,并且在该事务中能够 select 一个 Singer,那么 Cloud Spanner 保证您可以在事务的剩余部分安全地引用该 Singer。
换句话说:在您的 read/write 交易中为歌手执行 SELECT
而不是 SELECT FOR UPDATE
就足够了相同的行为。
Cloud Spanner 支持外键,允许您在 table 之间定义 relationships/constraints。您可以考虑定义外键约束以确保专辑中的所有行都具有歌手 table 中存在的有效 singer_id。有关详细信息,请参阅 https://cloud.google.com/spanner/docs/foreign-keys/overview