英文:
DynamoDBMapper Optimistic Locking - Do I have to call the load first?
问题
如果在更新对象时没有首先调用加载操作,如果发生版本不匹配,乐观锁定仍然会起作用吗?换句话说,是否必须调用加载操作才能使乐观锁定起作用?
英文:
I am trying to use Optimistic Locking for an application that I am creating. On the AWS website it mentions that "With optimistic locking, each item has an attribute that acts as a version number. If you retrieve an item from a table, the application records the version number of that item. You can update the item, but only if the version number on the server side has not changed. If there is a version mismatch, it means that someone else has modified the item before you did. The update attempt fails, because you have a stale version of the item." If I update an object without calling load first, does Optimistic Locking still work if a version mismatch were to happen? In other words, is call load mandatory for Optimistic Locking to work?
答案1
得分: 2
换句话说,调用加载对于乐观锁定是强制性的吗?
不是的,但通常情况下,如果在尝试更新之前不加载项目,您将难以使用乐观锁定。
原因是因为它的工作原理:当您发送用于乐观锁定的条件性更新请求时,条件通常是在项目上的**version
**属性的值,该值也会在同一更新请求中更新(通常递增1)。
因此,为了使更新起作用,您需要告诉DynamoDB version
属性的值必须是什么。
如果在尝试发送具有乐观锁定的条件性更新请求之前不加载项目,您怎么知道当前版本是多少呢?如果您不知道该版本是什么,那么您通常不能期望条件性更新请求起作用。
话虽如此,在某些情况下,可能不使用乐观锁定对于某些请求是有道理的。
例如,假设您需要更改给定属性的值,而项目的状态不会改变您的要求。在这种情况下,您不需要乐观锁定此更新:您可以简单地告诉DynamoDB执行更新(同时递增您的version
属性!)。任何其他并发操作将在它们是否也不使用乐观锁定(即不使用条件性更新)的情况下成功,或者如果它们使用了乐观锁定则会失败。
英文:
> In other words, is call load mandatory for Optimistic Locking to work?
It is not, but in general you'll have difficulty using optimistic locking if you don't load the item before trying to update it.
The reason is because of how it works: when you send a conditional update request for optimistic locking, the condition typically being on the value of a version
attribute on the item, that is also updated (generally incremented by 1) in the same update request.
Thus, in order for an update to work, you need to tell DynamoDB what the value of that version
attribute must be.
If you don't load the item before trying to send that conditional update request for optimistic locking, how would you know what the current version is? If you don't know what that version is, then you can't in general expect the conditional update request to work.
That said, there are some circumstances where it might make sense to not use optimistic locking for some requests.
For example, let's say that you need to change the value of a given attribute, and nothing in the state of the item would change your requirements. In this case, you don't need optimistic locking for this update: you can simply tell DynamoDB to perform the update (while also simultaneously incrementing your version
attribute!). Any other concurrent operations will either succeed if they are also not using optimistic locking (i.e., not using a conditional update), or they will fail if they are using it.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论