Cześć,
chciałem się dowiedzieć w jaki sposób implementujecie u siebie optimistic locking. Chciałbym, żeby (jako detal implementacyjny) optimistic locking był w całości obsłużony w warstwie infrastruktury, co oznacza dla mnie, że żadne pole (klasyczne version) nie powinno wchodzić głębiej.
Kończy się to u mnie dosyć skomplikowanymi konstruktami w implementacji repozytorium, tutaj przykład w Kotlinie:
class Repository {
fun updateById(id: String, update: (Domain) -> Domain): UpdateResult {
val documentToUpdate = findToUpdate() ?: return NothingToUpdateFound
val updated = update(documentToUpdate.toDomain())
val newDocument = Document.from(updated, updatedAt = clock.instant())
val updatedDocument = findAndReplace(
where(ID).isEqualTo(id).and(UPDATED_AT).isEqualTo(documentToUpdate.updatedAt),
newDocument
)
if(updatedDocument == null) {
return OptimisticLocking
}
return Updated(updatedDocument)
}
}
Przykład trochę uproszczony, ale chcę pokazać zasadę. Najbardziej nie podoba mi potrzeba przekazania funkcji, ale chyba tego nie uniknę (chyba, że macie jakieś pomysły)
To co lubię w tym podejściu:
- Całość jest obsłużona na poziomie infrastruktury
To czego nie lubię:
- Nie mogę klasycznie korzystać z repozytorium w stylu:
val obj = repository.findById(ID) obj.setX(3) repository.save(obj)