Хеш-таблица с транзакциями на 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<------------------
Вот, кстати, полный текст статьи, но там почти что невозможно обнаружить ссылку на исходники... Ага, не раз такое видел в комментариях!



