使用SpannerConnection.CreateUpdateCommand能否添加额外WHERE参数?
关于Spanner CreateUpdateCommand添加额外WHERE条件的问题
CreateUpdateCommand没法直接添加额外的WHERE条件,它的设计逻辑就是仅基于主键生成WHERE子句,专门用来做单条主键匹配的更新操作——这也是它效率较高的原因,内部针对主键更新场景做了针对性优化,但灵活性受限。
如果需要在WHERE子句里加入额外条件(比如你提到的ModifiedDate),有两种处理方式:
- 低并发场景下,可以先通过主键查询目标记录的ModifiedDate,确认和预期值匹配后,再用CreateUpdateCommand执行更新。但这种方式存在竞态风险,比如查询后到更新前,记录可能被其他请求修改。
- 更稳妥的方案是改用CreateDMLCommand,手动编写包含额外条件的UPDATE语句。虽然需要自己写DML,但能灵活添加任意WHERE条件,而且Spanner的DML执行效率完全能应对大部分业务场景,只要做好参数化处理避免SQL注入即可。
示例代码(CreateDMLCommand实现):
var updateSql = @"UPDATE YourTableName SET A = @A, B = @B WHERE PrimaryKeyId = @PrimaryKeyId AND ModifiedDate = @ModifiedDate"; var cmdUpdate = _spannerConnection.CreateDMLCommand(updateSql); // 添加参数 cmdUpdate.Parameters.Add("A", SpannerDbType.String, "Z"); cmdUpdate.Parameters.Add("B", SpannerDbType.String, "Y"); cmdUpdate.Parameters.Add("PrimaryKeyId", SpannerDbType.Int64, primaryKeyId); cmdUpdate.Parameters.Add("ModifiedDate", SpannerDbType.Date, new DateTime(2024, 1, 1)); await cmdUpdate.ExecuteNonQueryAsync();
内容的提问来源于stack exchange,提问作者JKennedy
相关产品推荐
相关产品推荐

