Хеш-таблица с транзакциями на Go
Привет, продолжим удивительное. Смех смехом, но на Go стали доступны:
И в отличие от C++, они еще не создают проблемы для Garbage Collector. Вы угадайте почему, а я немного процитирую:
------------------8<------------------
Все выглядит примерно так:
func NewMemDb() MemDb { /* ... */ }
type MemDb interface {
Close() error
StartTrn() Transaction
}
type Transaction interface {
Close() error
Get(key Ptrsz) (Ptrsz, bool)
All(getKeys bool, getVals bool) (keys []Ptrsz, vals []Ptrsz)
Set(key Ptrsz, val Ptrsz)
Del(key Ptrsz)
DependVal(key Ptrsz, val Ptrsz)
DependDel(key Ptrsz)
Commit() error
Rollback() error
}
А именно:
Объект
MemDb
создается с помощью функцииNewMemDb()
.У
MemDb
есть функцияClose()
-- мы ОБЯЗАНЫ ее вызвать!!!Объект
Transaction
создается с помощью функцииStartTrn()
.У
Transaction
тоже есть функцияClose()
. Да, мы ОБЯЗАНЫ!Transaction
работает с данными через lib.Ptrsz. Точно также, как и mdb.BlobMap.Чтение данных выполняется посредством функций
Get()
иAll()
. Возвращаемые имиPtrsz
указывают на внутренние структурыMemDb
. Они остаются валидными пока не завершена транзакция и не было вызововSet()
иDel()
, инвалидирующих указатели.Изменение данных выполняется посредством функций
Set()
иDel()
.MemDb
копирует себе байты, на которые указываютkey
иval
.Функции
DependVal()
иDependDel()
устанавливают зависимости. Их проверяетCommit()
.Функции
Commit()
иRollback()
завершают транзакцию. Завершают, но не закрывают! Мы ОБЯЗАНЫ вызватьClose()
!!Просто
Close()
означаетRollback()
.
------------------8<------------------
Вот, кстати, полный текст статьи, но там почти что невозможно обнаружить ссылку на исходники... Ага, не раз такое видел в комментариях!