Что такое кэш транзакции
Этот обзор поможет узнать больше об истории возникновения Bitcoin Cash и понять, чем он отличается от классического Bitcoin. Кроме того, вы получите информацию о том, где можно приобрести Bitcoin Cash, как и где его хранить и как приступить к самостоятельному майнингу.
История появления Bitcoin Cash
Датой появления Bitcoin Cash (BCH) считается 1 августа 2017 года. Именно в этот день было проведено голосование за введение протокола SegWit2x для повышения активности транзакций. Новая электронная валюта появилась в результате хардфорка материнского токена – монеты Bitcoin.
Хардфорк – это умышленное изменение протокола работы исходного кода криптовалюты, после которого система начинает функционировать по новым правилам. Криптовалюта, существовавшая до внесения изменений, продолжает функционировать параллельно.
Основателями нового альткоина стала группа программистов, лидером которой являлся бывший сотрудник компании Facebook Амори Сечет. Среди заинтересованных в появлении новой монеты также были:
Причины создания Bitcoin Cash
Размер первоначального блока в биткоине был ограничен 1 Мб. Поначалу Bitcoin выполнял свои задачи идеально, система платежей работала быстро и без сбоев. Но по мере того, как его популярность росла, скорость сети стала уменьшаться.
Все чаще стали возникать сложности с наличием свободного места, снизилась оперативность проведения транзакций и сформировались очереди. Держатели биткоина ждали подтверждение транзакций до нескольких дней.
Увеличить скорость прохождения транзакции можно было лишь заплатив увеличенную комиссию. Появилась необходимость в создании электронной валюты с увеличенным размером блока, который гарантирует высокую скорость проведения операций. Эти электронные деньги планировалось применять для проведения небольших платежей.
Разработчикам удалось найти компромиссное решение – создать протокол SegWit2x, позволяющий увеличить размер блоков до 2 Мб, а часть данных хранить за пределами блокчейна. Его активация была принята абсолютным большинством голосов майнеров биткоина – 95%. В результате был произведен выпуск в обращение новой криптовалюты. Первыми владельцами BCH стали держатели Bitcoin. Дальнейшие разработки позволили продолжить наращивание размера блоков Bitcoin Cash сперва до 8, а затем и до 32 Мб. Поэтому размер блокчейна биткоин кэш отличается от биткоина размером блоков.
Хардфорк 15 ноября 2018 года
В 2018 году у Bitcoin Cash произошел хардфорк — разветвление на Bitcoin ABC и Bitcoin SV.
Во главе Bitcoin Cash ABC стоял Роджер Вер. Сторонники данного разделения валют предлагали обновления:
- добавить возможность кросс-чейновых операций путем внесения нового операционного кода (OP_CHECKDATASIG);
- изменить последовательность обработки транзакций на «каноническую», когда перед верификацией происходит сортировка платежей по идентификатору, благодаря чему блокчейн сможет быстро подтверждать даже массивные блоки;
- предоставить возможность проголосовать за оптимальный размер блока, который на начальном этапе хардфорка составлял 2 Мб;
- запустить «умные» контракты.
Лидером Bitcoin Cash SV стал Крейг Райт. Сокращение SV можно перевести как «Взгляд Сатоши» (Satoshi Vision). Разработчики были уверены, что их версия полностью соответствует видению Сатоши Накамото.
Сторонники Bitcoin Cash SV предлагали сделать следующее:
- вернуть блокчейн в изначальное состояние сети Bitcoin Cash, в котором она пребывала на момент проведения хардфорка BTC;
- установить размер блоков в 128 Мб;
- использовать монету исключительно в качестве платежного средства (исключая старт-контракты и кросс-чейны).
Команды разработчиков развязали конкурентную борьбу, в том числе и с применением возможностей социальных сетей. Незадолго до ожидаемого обновления на личной странице Роджера Вера в Twitter появилась информация, что принадлежащий ему майнинг-пул направляет на Bitcoin ABC колоссальные вычислительные мощности, которые превышают возможности Bitcoin Cash.
В результате, форк BCH ABC получил поддержку различных торговых площадок и имел изначально более высокую среднерыночную стоимость. Bitcoin Cash ABC является основной версией Bitcoin Cash с оригинальным тикером BCH.
Тогда как Bitcoin SV до сих пор считается самой скандальной версией Bitcoin Cash. Большинство пользователей считали эту криптовалюту нерентабельной. На 1 июня 2020 года ее курс составил 194,04 $.
Где расплатиться BCH
На официальном сайте криптовалюты находится карта магазинов и прочих мест по всему миру, где принимают к оплате Bitcoin Cash. Всего их около 1,7 тысяч. Российские заведения также представлены, но пока несколько организаций на всю страну.
Технические характеристики и отличия от Bitcoin
Сравнение технических показателей обеих криптовалют позволит более полно представить себе картину различий между Bitcoin и Bitcoin Cash:
Аппаратные кошельки
Представляют собой физические устройства небольших размеров с высокими показателями безопасности хранения закрытых ключей. За всю историю существования «холодных» кошельков не произошло ни одной кражи средств, хранящихся на них. Наиболее популярны следующие аппаратные кошельки, которые поддерживают Биткоин Кэш:
- Trezor . Аппаратный кошелек с удобным пользовательским веб-интерфейсом, позволяющий абсолютно безопасно делить и использовать деньги, хранящиеся на нем. Стоимость устройств — от 100 до 150 долларов. Есть встроенная защита от записи, а пин-код меняется при каждой новой операции.
- Ledger . Считается безопасным местом для хранения криптовалюты. Все устройства компании имеют уникальный чип, а также снабжаются собственной ОС. В зависимости от модели может стоить от 80 долларов и выше.
Электронные кошельки
Такие кошельки могут стать идеальным вариантом для тех, кто часто совершает операции с Bitcoin Cash. Популярные варианты:
- Jaxx . Может использоваться не только для хранения биткоин кэш, но и для осуществления обменных операций разных криптовалют прямо из кошелька. Имеет интуитивно понятный пользовательский интерфейс.
- Bitcoin Cash. Для создания кошелька Bitcoin Cash потребуется посетить официальную страницу .
Майнинг Bitcoin Cash
Блокчейн Bitcoin Cash использует алгоритм консенсуса Proof of Work. Для подтверждения транзакций используют вычислительные мощности компьютеров. Вознаграждение за решение блока Bitcoin Cash составляет 12,5 монет.
Для добычи Bitcoin Cash зачастую используются специализированные процессоры на интегральных схемах — ASIC. Их разработали изначально для майнинга Bitcoin, но устройства оказались пригодны для добычи любых цифровых активов на алгоритме SHA-256.
В 2020 году майнинг Bitcoin Cash на ASIC-майнерах остается одним из наиболее выгодных. За 1 Thash/s добытчик сможет получить примерно 0.25 USD в день. Срок средней окупаемости добычи с использованием современных процессоров в первой половине 2020 года может занять от 150 до 280 дней.
Заключение
Bitcoin Cash – это криптовалюты, с помощью которой проводят электронные платежи. Преимущества Bitcoin Cash перед биткоином:
Транзакционная память — технология синхронизации конкурентных потоков. Она упрощает параллельное программирование, выделяя группы инструкций в атомарные транзакции. Конкурентные потоки работают параллельно 1 , пока не начинают модифицировать один и тот же участок памяти. К примеру, операции добавления узлов в красно-чёрное дерево (анимация в заголовке) способны работать параллельно в нескольких потоках.
Подход к управлению конкурентностью с использованием транзакционной памяти называют оптимистичным: мы считаем, что потоки работают независимо друг от друга и в редких случаях изменяют одни и те же данные. В таком случае большинство транзакций заканчивается успешно. В противоположность этому, подходы с использованием блокировок пессимистичны: мы полагаем, что потоки будут конфликтовать всегда и всегда запрещаем им находиться в критической секции одновременно.
Если происходит конфликт данных, транзакция отменяется. Отмена транзакции приводит к отмене действий, которые совершал поток за время транзакции. После этого транзакция обычно перезапускается, либо вызывается функция, заранее указанная как «запасной выход», чаще всего откат на использование блокировок.
- относительная простота использования (заключение целых методов в блок транзакции);
- полное отсутствие блокировок и взаимных блокировок;
- повышение уровня параллелизма, а следовательно, и производительности.
- при неправильном использовании возможно падение производительности и некорректная работа;
- ограниченность применения — в транзакции нельзя выполнять операции, действие от которых невозможно отменить;
- сложность отладки — поставить breakpoint внутри транзакции невозможно.
Рождение технологии
Транзакции в базах данных существуют уже несколько десятилетий. Впервые идея переноса транзакций из мира баз данных в мир параллельного программирования возникла в 1980-х. Развивали и популяризовали технологию Maurice Herlihy, Ravi Rajwar, Nir Shavit. Первые исследования предлагали аппаратные реализации транзакционной памяти, которым не суждено было родиться ещё 30 лет.
В 1990-х появились первые программные реализации технологии, аппаратные реализации подтянулись к 2000-ым.
Программные реализации (Software Transactional Memory, STM)
Среди множества реализаций программной транзакционной памяти я хотел бы выделить четыре. Примеры доступны на github: JIghtuse/tm-experiments.
Clojure
Clojure — единственный язык, ядро которого поддерживает транзакционную память. Основные конструкции STM: ref (ссылка на данные, через которую данные меняются только в транзакции) и dosync (блок транзакции).
Подход к STM в Clojure называется управлением конкурентным доступом с помощью многоверсионности (MultiVersion Concurrency Control, MVCC): хранятся множественные логические версии данных, используемых в транзакции. В течение транзакции поток наблюдает снимок данных на момент её начала.
Диаграмма версий ссылок в транзакции Clojure.
Транзакции 1 и 2 начинаются в одно и то же время, получая одну копию версии ref v0 . Внутри транзакций происходит обработка данных, которая меняет значение ref . Первая транзакция заканчивается раньше и выигрывает гонку за обновление ref новым значением. Затем заканчивается вторая транзакция, и её попытка обновить ref проваливается (красная стрелка на диаграмме), поскольку версия ref была не той, которая ожидалась. В этом случае транзакция перезапускается, получая копию новой версии ref . Поскольку ни одна другая транзакция не пытается изменить ref , во второй раз транзакция 2 успешно завершается.
Вычисления в транзакции 3 не меняют значения ref , поэтому перезапуск не вызывается и она успешно завершается.
Рассмотрим пример перевода средств между банковскими аккаунтами:
Программа работает в одном потоке, но потокобезопасно.
Существуют варианты использования конкурентности, при которых среде позволяется «расслабиться» для достижения дополнительной производительности. К примеру, представьте что вы храните журнал транзакций за день. Порядок транзакций в журнале не важен, если вы знаете, что конечный баланс будет корректным. Если вы получаете два взноса в $100 и $50, очерёдность внесения их в журнал не играет роли. Взнос от двух транзакций коммутативен, и clojure предоставляет конкурентную операцию commute как раз для таких случаев.
Haskell
Транзакционная память в Haskell содержится в библиотеке STM, которая входит в Haskell Platform. Некорректное использование транзакционных типов определяется на этапе компиляции программы.
- атомарность — эффект от atomically act будет виден другим потокам сразу и целиком. Ни один другой поток не способен увидеть состояние внутри атомарного действия, лишь конечное состояние.
- изоляция — во время вызова atomically act действие act выполняется абсолютно независимо от других потоков. Оно снимает состояние мира при запуске и выполняется в этом состоянии.
- readTVar :: TVar a -> STM a
- writeTVar :: TVar a -> a -> STM ()
Scala
Реализация STM для Scala (ScalaSTM) разрабатывалась под впечатлением от реализаций в Haskell и Clojure. Помимо Scala, ScalaSTM вызывается из Java и Clojure. Реализация используется в популярном фреймворке для написания параллельных программ Akka.
ScalaSTM предоставляет ячейку Ref , изменяемую исключительно внутри транзакции. Структуры данных на основе неизменяемых объектов и Ref используются многими потоками.
Рассмотрим реализацию двусвязного потокобезопасного списка с использованием транзакционной памяти. К сожалению, собрать пример на Scala мне не удалось, оставляю это занятие читателю.
Для реализации разделяемой структуры указатели на следующий и предыдущий узел делают потокобезопасными. Если существует возможность того, что один поток записывает переменную в то же время, когда другой получает к ней доступ (читает или записывает), то используют Ref . Определим класс для узла списка и инициализируем голову списка. Список кольцевой: при создании указатели головного списка указывают на него же. Эти указатели никогда не равны null .
Если x является Ref , то x() получает значение, сохранённое в x , а x() = v задаёт его равным величине v .
Ref читаются и записываются только внутри атомарного блока (транзакции). Это проверяется во время компиляции. Далее демонстрируется использование транзакции.
Scala объединяет идеи многих парадигм программирования. Неудивительно, что и в области транзакционной памяти язык имеет самобытные технологии. Вышеупомянутый фреймворк Akka объединяет возможности акторов и транзакционной памяти, получая агенты и транзакторы, которые окончательно взорвут вам мозг.
C/C++ (GCC 4.7+)
Начиная с версии 4.7, GCC поддерживает транзакционную память. Реализация представляет собой библиотеку времени выполнения libitm, для компиляции указывается флаг -fgnu-tm (-mrtm, -mhle). Библиотека разрабатывалась с оглядкой на черновик транзакционных конструкций для C++ (предлагается включение в стандарт языка).
Большинство реализаций аппаратной транзакционной памяти используют принцип наибольшего усилия. Поэтому практичные реализации используют объединение технологий аппаратурной и программной транзакционной памяти. Такие системы называют системами «гибридной транзакционной памяти». К ним относится, в частности, реализация GCC.
- __transaction_atomic < … >— указание, что блок кода — транзакция;
- __transaction_relaxed < … >— указание, что небезопасный код внутри блока не приводит к побочным эффектам;
- __transaction_cancel — явная отмена транзакции;
- attribute((transaction_safe)) — указание транзакционно-безопасной функции;
- attribute((transaction_pure)) — указание функции без побочных эффектов.
Для демонстрации использования транзакционной памяти в C будем заполнять гистограмму данных в конкурентных потоках.
Используется один блок транзакции на цикл обновления гистограммы. Библиотека времени выполнения (либо аппаратное обеспечение) определит, когда и какие транзакции перезапустить.
Аппаратные реализации (Hardware Transactional Memory, HTM)
Лишь в последнее время начали появляться аппаратные реализации транзакционной памяти.
Sun Rock (SPARC v9) 2007-2008
Микропроцессор Rock от компании Sun Microsystems был первым микропроцессором с аппаратной поддержкой транзакционной памяти. 64-разрядный процессор архитектуры SPARC v9 имел 16 ядер.
В 2007 компания объявила о поддержке технологии. Для функционирования транзакционной памяти были добавлены две новые инструкции chkpt и commit и один новый статусный регистр cps . Инструкция chkpt <fail_pc> использовалась для начала транзакции, а инструкция commit для её завершения. При отмене транзакции происходил переход на <fail_pc> , в это время можно было проверить регистр cps для определения причины отмены. Транзакции прерывались по причинам конфликтов данных, промахов TLB, прерываний, сложных инструкций. Тем не менее, во многих случаях использование транзакционной памяти в процессоре Rock давало преимущества в синхронизации.
В 2008 инженеры Sun представили интерфейс транзакционной памяти и симулятор Adaptive Transactional Memory Test Platform. После покупки компании Sun корпорацией Oracle проект Rock был закрыт: «Этот процессор имел два потрясающих свойства: он был невероятно медленным и потреблял громадное количество энергии. Он был настолько горячим, что им пришлось поставить сверху 12 дюймов охлаждающих вентиляторов, чтобы процессор не перегревался. Было бы безумием продолжать этот проект.» 2
IBM BlueGene/Q (PowerPC A2) 2011
Суперкомпьютер Sequoia с архитектурой BlueGene/Q стал первой коммерческой системой с аппаратной поддержкой транзакционной памяти. Технология работает в 32-мегабайтном кэше второго уровня процессора PowerPC A2 (PowerPC BQC 16C). Данные в кэше имеют метку “версия”, и кэш способен хранить несколько версий одних и тех же данных.
Программа сообщает процессору о начале транзакции, делает свою работу и сообщает, что транзакцию нужно завершить (commit). В случае если другие потоки изменяли те же данные — создавая версии — кэш отклоняет транзакцию и поток пытается провести её вновь. Если других версий данных не появилось, данные модифицируются и транзакция завершается успешно.
Технология версионных меток в PowerPC A2 также используется для спекулятивного выполнения. Вместо ожидания новой версии данных поток может выполнить вычисления с имеющимися данными, спекулятивно производя полезную работу. Если данные были такими же, как и после обновления, поток завершает (commit) работу из кэша. Производительность выше: поток выполнил работу до получения финального значения. В противном случае результаты спекулятивной работы отклоняются и поток производит вычисления с корректными значениями.
Поддержка транзакционной памяти — в некотором роде логическое расширение возможности, давно присутствующей в процессорах PowerPC — “load-link/store-conditional”, или LL/SC. LL/SC — примитивная операция, которая может использоваться как строительный блок для всех потокобезопасных конструкций. Первая часть LL/SC — load-link — используется программой для получения данных из памяти. Далее поток изменяет данные и записывает их обратно в память с помощью store-conditional. Команда завершается успешно, если данные не менялись. В противном случае программа повторяет действия с данными с начала.
Транзакционная память — LL/SC на стероидах: потоки выполняют операции LL на множестве различных областей памяти, а операция завершения транзакции атомарно изменяет все области памяти или отменяет транзакцию (как SC).
Ruud Haring, который представил работу IBM по транзакционной памяти на Hot Chips, признался, что при реализации компания столкнулась со множеством нетривиальных проблем. При всей сложности, реализация имеет ограничения: она не предоставляет межпроцессорной поддержки транзакций. Проблема не актуальна для Sequoia и в то же время позволяет оценить выигрыш от использования транзакционной памяти.
IBM zEnterprise EC12 (Z/Architecture) 2012
Первый коммерческий сервер с поддержкой инструкций транзакционной памяти. При использовании транзакционной памяти IBM обнаружила рост производительности в 45% по сравнению с машиной z196 в базе данных DB2 и работах в виртуализированных серверных нагрузках.
IBM Power8 (Power) 2013
Контроллеры памяти Power 8 поддерживают транзакционную память. Поддержка технологии в ядре Linux появилась начиная с версии ядра 3.9.
Информации по HTM в Power8 удалось найти не так много, надеюсь она ещё появится.
Intel Haswell (x86) 2013
В 2012 компания Intel объявила о введении расширений транзакционной синхронизации (Transactional Syncrhonization Extensions, TSX) в набор инструкций x86. Расширения позволяют программистам помечать отдельные участки кода как транзакции.
В 2013 с выходом поколения процессоров Haswell аппаратная поддержка транзакционной памяти впервые становится доступной на потребительском уровне.
Haswell управляет наборами чтения и записи с гранулярностью линии кэша, отслеживая адреса кэша данных L1. Конфликты определяются с помощью протокола когерентности кэша. Что логично предположить, поскольку задачи определения конфликтов транзакций и поддержки когерентности кэшей очень близки: если значение меняется в одном потоке, но не в других, то что-то неладно.
TSX состоит из двух частей. Аппаратное исключение блокировок (Hardware Lock Elision, HLE) предоставляет простую конвертацию программ на основе блокировок в транзакционные программы, причём полученные программы будут обратно совместимы с существующими процессорами. Ограниченная транзакционная память (Restricted Transactional Memory, RTM) является более полной реализацией транзакционной памяти.
Hardware Lock Elision
HLE слегка модифицирует инструкции для изменения участка памяти. Технология добавляет префиксы — инструкции, не производящие каких-либо действий, но меняющие интерпретацию следующей инструкции — для модификации инструкций взятия и освобождения блокировки (XACQUIRE и XRELEASE соответственно).
Между взятием и освобождением блокировки процессор отслеживает участки памяти, которые читают и записывают потоки. В случае конфликта — если два потока модифицируют одни данные, или один поток читает данные, которые другой записывает — процессор отменяет транзакцию при освобождении блокировки. В противном случае, выполнение продолжается нормально.
Таким образом, HLE позволяет общепринятому коду на основе блокировок работать оптимистично. Каждый поток будет считать, что получил блокировку, в то время как остальные потоки могут работать одновременно. До тех пор пока это безопасно, транзакции не отменяются.
Технология обратно совместима с процессорами без поддержки HTM. Операции по управлению блокировкой остаются, но со специальным префиксом. Процессоры Haswell будут учитывать префикс и использовать транзакционное исполнение вместо манипуляций с блокировками. Любой другой процессор будет игнорировать префикс и просто управлять блокировкой, используя традиционное поведение на основе блокировок. Инструкции XACQUIRE и XRELEASE уже существуют, но не несут какого-либо смысла, пока не используются со специфичными инструкциями.
HLE позволяет писать программы и операционные системы, которые будут использовать транзакции на Haswell, повышая уровень параллелизма без блокировок. Код будет работать корректно на текущих процессорах. В итоге, ввод новой возможности будет простым и безопасным.
Операционные системы реализуют блокировки в ядре как участки памяти, обычно используя типичный для процессора целый тип. Берущий блокировку поток делает нечто с этим участком памяти, к примеру увеличивает значение с 0 на 1. Для освобождения блокировки применяется обратная операция (к примеру, декремент с 1 до 0). Изменения видимы каждому процессорному ядру и каждому потоку в системе, поэтому другие потоки сразу же определяют, что не могут взять блокировку и должны ждать её освобождения (приобретение значения 0).
С префиксами XACQUIRE/XRELEASE попытка взятия блокировки завершается успешно, и процесс полагает, что блокировка принадлежит ему и работает далее. Однако глобального изменения значения блокировки не происходит. Таким образом, поток с блокировкой будет полагать, что её значение равно 1, а остальные потоки системы будут по-прежнему видеть 0. Это позволяет другим потокам одновременно брать блокировку, и процессор вновь будет им лгать. Поток будет видеть блокировку взятой, а другие потоки так не будут считать.
Такое поведение объясняет название HLE: вместо изменения значения с 0 на 1 и обратно, оно просто остаётся равным 0. “Необязательная” запись исчезла.
Restricted Transactional Memory
RTM требует большего участия: он уходит от обратной совместимости и вводит три новых инструкции. В то время как HLE неявно использует транзакции, позволяя коду на основе блокировок работать параллельно, RTM делает начало, завершение и прерывание транзакций явными. Поток начинает транзакцию инструкцией XBEGIN, предоставляя “запасную” функцию, которая запускается в случае прерывания транзакции. Транзакция завершается инструкцией XEND, при этом процессор проводит транзакцию если не было конфликтов или прерывает её, переходя в запасную функцию. Транзакции явно прерываются в программе инструкцией XABORT.
Благодаря явному использованию границ и “запасному выходу”, RTM позволяет контролировать транзакции полнее, чем HLE. В долгосрочной перспективе RTM упростит реализацию возможностей транзакций.
Выводы
Кэш объектов в 1С состоит из двух частей - "Обычный кэш" и "Транзакционный кэш" .
Обычный кэш .
Уникальным идентификатором для кэша является ссылка на объект базы данных. Поэтому в кэше хранится или объект целиком со всеми своими данными, или представление объекта.
Если запросить у кэша представление объекта и там оно есть, то это представление будет взято из кэша . Если в кэше не представление объекта, а весь объект, то представление будет сформировано на основе данных объекта, хранящегося в кэше . Если же ни того, ни другого в кэше нет, то в кэш из базы данных будут считаны только поля, необходимые для запроса.
Если запросить у кэша реквизит объекта, и в кэше есть этот объект, то без проблем - кэш сразу вернёт этот реквизит. Если в кэше только представление объекта, то кэш не будет и пытаться искать в нём нужный реквизит, а просто удалит его, скачает из базы данных весь объет и будет выковыривать реквизит из него.
Обычный кэш удаляет у себя данные ещё в следующих случаях:
1. Поступают новые данные, а их негде хранить - закончилось свободное место. Тогда самые старые данные удаляются.
2. Если при повторном обращении к данным, уже находящимся в кэше прошло более 20 секунд, кэш сверяет эти данные с базой данных, и если в базе данных они изменились, то удаляет их у себя и скачивает взамен из базы данных их новую версию.
3. Прошло более 20 минут после того, как данные были помещены в кэш .
Транзакционный кэш .
Транзакция - это неделимая последовательность операций с данными, переводящая базу данных из одного целостного состояния в другое. То есть, если какая-либо операция не просто обращается к базе данных, а производит в ней изменения, то она упаковывается вместе со всеми сопутствующими операциями в транзакцию . И если хоть одну операцию из транзакции нельзя выполнить, то все операции из этой транзакции отменяются и база данных возвращается в состояние, в котором она была до начала транзакции (это называется откат транзакции - Rollback ).
В отличие от обычного кэша , транзакционный кэш не проверят данные на валидность, если прошло более 20 секунд от последнего обращения, а просто блокирует изменение в базе тех данных, которыые он взял из базы данных, пока транзакция не завершится.
Транзакционный кэш удаляет у себя данные в следующих случаях:
1. Поступают новые данные, а их негде хранить - закончилось свободное место. Тогда самые старые данные удаляются.
2. Транзакция завершилась неуспешно.
3. Транзакция завершилась успешно. Тогда данные переносятся в обычный кэш .
Допустим в нашем документе-объекте есть только ссылка на элемент справочника. Если нам понадобятся какие-то сведения об этом элементе (например, значение реквизита), то платформа 1С обратится по этой ссылке в кеш объектов (расположенному в оперативной памяти, ReadOnly) и попытается найти там данные. Если в кеше объектов не будет нужных данных, то он обратится к базе данных с тем, чтобы прочитать все данные объекта соответствующей ссылки. После того как все данные, хранящиеся в реквизитах нужного элемента будут считаны в кеш объектов, кеш объектов вернет запрашиваемые данные.
Кеш объектов состоит из двух частей: транзакционного кеша (активная транзакция) и обычного кеша.
Для обычного кеша:
Считанные данные будут находиться в кеше до тех пор, пока не наступит одно из следующих событий:
считанные данные будут вытеснены из кеша другими считанными данными других объектов (переполнение кеша);
при очередном обращении к кешу окажется, что считанные данные были изменены в базе данных;
закончится интервал времени в 20 минут.
Все считанные данные помещаются в последовательную очередь, и наиболее старые данные будут вытесняться из кеша последними считанными. При повторном обращении к кешу за данными уже считанного объекта будет анализироваться интервал времени, прошедший с момента появления данных в кеше.
Если обращение происходит в пределах 20 секунд после поступления данных в кеш, данные считаются верными). Если интервал превысил 20 секунд, будет выполняться проверка на соответствие версии данных, хранящихся в кеше, версии данных, находящихся в базе данных.
Если окажется, что версии данных не совпадают (т. е. произошло изменение данных в базе данных), то будет выполнено повторное считывание новых данных из базы данных и удаление старых в кеше.
Кроме всех вышеперечисленных событий считанные данные будут удалены из кеша по истечении 20 минут после их последнего считывания из базы данных.
Для транзакционного кеша (когда обращение к данным происходит в рамках транзакции) отличие заключается в том, что все данные являются гарантированно актуальными (при считывании данных в транзакционный кеш устанавливается блокировка на данные в базе данных).
Транзакционный кеш хранит считанные данные до тех пор, пока они не будут вытеснены более поздними или пока не закончится транзакция. По окончании транзакции для случая отказа транзакции кеш очищается, для случая успешного завершения транзакции кеш очищается, а данные переносятся в обычный кеш.
Кеширование конфигурации
Очень часто у пользователей появляются очень странные ошибки — у одного пользователя программа работает правильно — у другого или на другом компьютере совершенно иначе. Либо возникает ошибка потока данных. Часто что причина таких и некоторых других проблем в 1С 8 — кеш конфигурации.
Кеширование используется для ускорения работы программы, в частности, в 1С на компьютер пользователя подгружаются файлы конфигурации, что бы не запрашивать их с сервера при каждом обращении. И когда платформа 1С не правильно отрабатывает кэширование конфигурации мы получаем неадекватное поведение программы.
Читайте также: