Dynamodb ConditionalCheckFailedException auf lese - / update-operation - java-sdk
Ich bin neu in DynamoDB und versuchen Sie ein Beispiel-Szenario mit der Transaktion unterstützen. Ich bin mit der gleichen Person in dynamodb-Transaktion Bibliothek. Nur der Unterschied ist ich habe ein Auswahl-Taste mit der Raute-Taste. Hier ist die definition der Tabelle:
ItemId
--> hash-Schlüssel , string -ItemName
--> Bereich key, string
@DynamoDBTable(tableName = "Item")
public static class ExampleItem {
private String itemId;
private String value;
private String itemName;
private Long version;
@DynamoDBHashKey(attributeName = "ItemId")
public String getItemId() {
return itemId;
}
public void setItemId(String itemId) {
this.itemId = itemId;
}
@DynamoDBRangeKey(attributeName="ItemName")
public String getItemName() {
return itemName;
}
public void setItemName(String itemName) {
this.itemName = itemName;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
@DynamoDBVersionAttribute
public Long getVersion() {
return version;
}
public void setVersion(Long version) {
this.version = version;
}
}
Wie Sie sehen können, bin ich mit dem version-Attribut als gut.
Nun, ich versuche zum ausführen einer einfachen create-oder update-Szenario mit der Transaktion/dbmapper. Hier der code-snippet.
Transaction t1 = txManager.newTransaction();
ExampleItem keyItem = new ExampleItem();
keyItem.setItemId("Item1");
keyItem.setItemName("USA");
ExampleItem item = t1.load(keyItem);
if (item != null) {
item.setValue("Magenta");
item.setItemName("UK");
t1.save(item);
} else {
item = new ExampleItem();
item.setItemId(keyItem.getItemId());
item.setItemName("USA");
item.setValue("Violet");
t1.save(item);
}
t1.commit();
t1.delete();
Ich bin in der Lage, um den Datensatz hinzufügen, ohne jede Frage, aber ich habe da ein problem, wenn ich versuche zu Lesen, das erfassen und zu aktualisieren jedes Attribut. Ich bin immer folgende exception:
Uncaught exception:com.amazonaws.services.dynamodbv2.model.ConditionalCheckFailedException: Status Code: 0, AWS Service: null, AWS Request ID: null, AWS Error Code: null, AWS Error Message: Item {ItemId={S: Item1,}, ItemName={S: UK,}} had unexpected attributes: Status Code: 0, AWS Service: null, AWS Request ID: null, AWS Error Code: null, AWS Error Message: expected attribute(s) {version={Value: {N: 1,},Exists: true}} but found null
com.amazonaws.services.dynamodbv2.model.ConditionalCheckFailedException: Status Code: 0, AWS Service: null, AWS Request ID: null, AWS Error Code: null, AWS Error Message: Item {ItemId={S: Item1,}, ItemName={S: UK,}} had unexpected attributes: Status Code: 0, AWS Service: null, AWS Request ID: null, AWS Error Code: null, AWS Error Message: expected attribute(s) {version={Value: {N: 1,},Exists: true}} but found null
Sieht aus wie es hat etwas zu tun mit der version, aber Sie wissen nicht, wo mache ich falsch. Jegliche Hinweise werden dankbar angenommen.
Dank
Shamik
- gefunden jedes Ding, das hilfreich?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sieht aus wie Sie benötigen, um die version, die beim erstellen der Element-Klasse. Es erwartet 1 aber null gefunden. Die versionedAttribute erwartet einen Wert, und es scheint, dass, wenn das Element zum ersten mal erstellt wird es erwarten, dass 1.
Wenn Sie ein update für diesen Artikel in die Zukunft, es sollte sich um die Inkrementierung der version intern.
Dynamodb hat dieses Konzept der Optimistic Locking, ist Strategie, um sicherzustellen, dass die client-side Element, das Sie aktualisieren (oder löschen) ist das gleiche wie das Element, in DynamoDB.
Wenn es ein erstes update, müssen Sie in diesem format Folgen
Erklärung: Wir sagen, dass itemToSave gespeichert werden soll nur, wenn beide "ItemId", "ItemValue" Kombination gibt es nicht in dynamodb.
Für ein update zu einem vorhandenen Element in dynamodb, müssen Sie in diesem format Folgen
Speichern wird nur gelingen, wenn die version, mit der man sparen, ist das gleiche in den Dynamodb, wenn nicht retten, schlägt fehl mit ConditionalCheckFailedException dann haben Sie erneut von Schritt 1. Dies ist erst Lesen, dann Schreiben.
In der Regel tritt dies auf, wenn Ihr Schlüssel sind die gleichen, die für mehr als ein element in dynamodb. Zum Beispiel, wenn Sie haben Ordner mit id als hashKey und Ordnername als rangeKey, werden Sie nicht speichern Sie die Ordner wieder, wo Ihr hash(hashkey+rangeKey) wäre der gleiche.