amazon-web-services - DynamoDB 是否支持悲观锁定?
问题描述
更新
下面的原始问题 - 修改后的问题是:
忽略下面我的用例,使用发电机可以做一个老式的悲观锁,整个项目被锁定以进行并发访问,直到我完成它?
根据标题,快速提问——我所有的谷歌搜索都只显示了乐观锁定。
想知道是否可以简单地执行相当于“选择更新”的操作?
用例需要读取,然后更新修改的版本。进行一次读取和一次写入会很好,而不是乐观策略所需的 2 次读取和一次写入。
谢谢。
解决方案
“项目”的锁定是作为 Java SDK 中的客户端扩展提供的,您需要做一些工作才能真正使用它。
原因是 dynamo DB 的分布式特性。请注意,该锁不是“服务器端”上的经典“基于行”的锁。使用相关“项目”的客户必须遵守锁。
用于管理锁的客户端类称为“AmazonDynamoDBLockClient”。如果您搜索此类,您将找到来自 amazon SDK 开发人员的使用示例。
需要做的事情:
- 在写入“项目”之前为锁添加全局 ID 以询问
- 让编写者知道锁并防止写入以防它处于“活动”状态
- 超时锁定,以便在客户端死亡的情况下释放锁定
取自这样的样本:
//build a lock client. any other client _not_ using this _same_ lock
//can still modify the data! this is not 'safe' in this regard!
final AmazonDynamoDBLockClient client = new AmazonDynamoDBLockClient(
AmazonDynamoDBLockClientOptions.builder(dynamoDB, "customLockTable")
.withTimeUnit(TimeUnit.SECONDS)
.withLeaseDuration(100L)
.withHeartbeatPeriod(40L)
.withCreateHeartbeatBackgroundThread(createHeartbeatBackgroundThread)
.build());
//try to acquire a lock on the partition key "FirstPart"
//of course this can fail, since someone else could have the lock
final Optional<LockItem> lockItem =
client.tryAcquireLock(AcquireLockOptions.builder("FirstPart").build());
要使上述代码正常工作,您需要创建一个特定的“customLockTable”,这本质上不是数据库后端的一部分。所以上面的例子是不完整的!
推荐阅读
- r - 加入 2 个数据帧的指南,使 df2 的每一行成为 df1 的一整列,迭代 df2 的所有行
- c - 有没有办法延迟openmp上每个线程的创建?
- c# - 无法在.net 中下载网页
- rust - 如何转换模式匹配以使用 Rust 2018 的自动借用?
- c - 交叉引用 typedef 结构
- c# - 如何验证 pdf 文件是否包含有效的数字签名?
- python-3.x - 如何在列表中求平方根
- acumatica - 操作栏自定义项的可见性
- java - 当 net-snmp get 返回响应事件时,为什么 snmp 代理不接受 snmp4j get 上的请求
- azure-ad-b2c - 是否可以强制所有 Azure AD B2C MFA 都是电话而不是短信?