2016-07-29 23 views
1

Ich habe ein Problem mit IndexedDB. Ich möchte einen der eindeutigen Indizes zwischen allen Datensätzen innerhalb einer Transaktion austauschen, aber die Transaktionen werden fehlschlagen, weil die eindeutige Einschränkung eines Datensatzes verletzt wird. Das ist seltsam für mich, weil ich in dieser Transaktion den Index, der verletzt wird, umgeschrieben habe.Auslagern von Indizes zwischen Datensätzen innerhalb einer Transaktion

Ist das ein Fehler von IndexedDB oder mache ich etwas falsch? Hier

ist ein Beispiel:

Start Indizes:

[ 
    { 
     id: 1, 
     id2: 1 
    }, 
    { 
     id: 2, 
     id2: 2 
    }, 
    { 
     id: 3, 
     id2: 3 
    }, 
    { 
     id: 4, 
     id2: 4 
    } 
] 

Mutation Indizes:

[ 
    { 
     id: 1, 
     id2: 4 
    }, 
    { 
     id: 2, 
     id2: 3 
    }, 
    { 
     id: 3, 
     id2: 2 
    }, 
    { 
     id: 4, 
     id2: 1 
    } 
] 

Die Transaktion wird scheitern, weil id2 auf id nicht eindeutig zuzuordnen sind, da id 4 bereits ihre id2 auf 4 setzen.

+0

Können Sie ein Codebeispiel hinzufügen? Es ist schwierig, genau zu sagen, was Sie versuchen (z. B. Löschen und erneutes Hinzufügen der Datensätze?). Wenn Sie den Index neu schreiben, frage ich mich, ob Sie dies in einer Upgrade-Transaktion tun und einen neuen Index löschen/erstellen. Tritt dasselbe Verhalten in allen Browsern auf? –

+1

Wenn ich dies noch einmal anschaue, frage ich mich, ob Sie annehmen, dass die Eindeutigkeitsbeschränkung nur angewendet wird, wenn die Transaktion festgeschrieben wird. Das ist nicht korrekt - die Einschränkung wird bei jeder Anfrage erzwungen. Das Setzen von zwei Werten mit vertauschten Indexschlüsseln würde beim ersten Setzen fehlschlagen. Es wird notwendig sein, einen zu löschen, den zweiten zu aktualisieren und dann den (aktualisierten) zuerst neu zu setzen. –

+0

Ja, das war meine Annahme. Ich dachte, wenn eine Transaktion verwendet würde, wäre das System in der Lage herauszufinden, dass die Einschränkung nicht verletzt wird, da der referenzierende Datensatz ebenfalls aktualisiert wurde. Hier ist das von Ihnen angeforderte Muster. Sorry für die späte Antwort: http://codepen.io/kkirby/pen/mAbrLR?editors=0010 – Kyle

Antwort

2

Die Eindeutigkeitseinschränkung wird auf jede einzelne Anforderung angewendet, nicht nur, wenn die gesamte Transaktion festgeschrieben wird. So zum Beispiel:

var store = db.createObjectStore('s', {keyPath: id}); 
store.createIndex('by_idxid', 'idxid', {unique: true}); 

store.put({id: 1, idxid: 1111}); 
store.put({id: 2, idxid: 2222}); 

... 

var tx = db.transaction('s', 'readwrite'); 
var store = tx.objectStore('s'); 
store.put({id: 1, idxid: 2222}); // this request will fail 
store.put({id: 2, idxid: 1111}); 

Sie müssen zuerst den Datensatz entfernen, z.B .:

store.delete(2); 
store.put({id: 1, idxid: 2222}); 
store.put({id: 2, idxid: 1111});