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