Cloud Spanner交错表写入时父表是否会被锁定?
在Cloud Spanner中写入交错子表Albums时,是否会锁定父表Singers?
表结构定义
CREATE TABLE Singers ( SingerId INT64 NOT NULL, FirstName STRING(1024), LastName STRING(1024), SingerInfo BYTES(MAX), ) PRIMARY KEY (SingerId); CREATE TABLE Albums ( SingerId INT64 NOT NULL, AlbumId INT64 NOT NULL, AlbumTitle STRING(MAX), ) PRIMARY KEY (SingerId, AlbumId), INTERLEAVE IN PARENT Singers ON DELETE CASCADE;
问题核心
对Albums表执行写入操作时,是否会同时锁定Singers表,还是仅锁定Albums表?
官方锁机制说明(翻译)
与其他锁定整张表或整行的方式不同,Cloud Spanner中事务锁的粒度是单元格(即行与列的交叉点)。这意味着两个事务可以同时读取和修改同一行的不同列。为了在同一时间让尽可能多的事务能够访问特定数据单元格,Cloud Spanner采用了不同的锁模式。
结论与分析
根据上述锁机制,更新交错子表Albums时不会锁定父表Singers:
- Spanner的锁粒度精确到单元格,写入Albums的操作只会针对该表内涉及的行和列(比如对应
SingerId+AlbumId主键行的AlbumTitle等字段)加锁,完全不涉及父表Singers的任何单元格。 - 父表Singers的行只有在被直接修改(比如更新
FirstName、LastName等字段)时才会触发锁,子表的写入操作不会关联父表的锁逻辑。 - 即使设置了
ON DELETE CASCADE,也仅在父表行被删除时触发子表的级联删除,子表的写入操作不会影响父表的锁状态。
内容的提问来源于stack exchange,提问作者MrLister
相关产品推荐
相关产品推荐

