Режимы атомарности#

По умолчанию кеш поддерживает только единичные атомарные операции (режим ATOMIC). Массовые (bulk) операции, например putAll() и removeAll(), выполняются как последовательность отдельных операций добавления и удаления.

Транзакционный режим кеша позволяет выполнить группировку нескольких кеш-операций по одному или нескольким ключам. Все сгруппированные операции или завершаются успешно, или завершаются неудачей. Частичное изменение записей, которые охвачены транзакцией, невозможно: транзакция целиком выполняется как атомарная операция.

Чтобы включить поддержку транзакций в кеше, установите в его конфигурации значение TRANSACTIONAL для параметра atomicityMode.

Внимание

Если настраивается несколько кешей в одной кеш-группе, они должны быть полностью атомарными или полностью транзакционными. В одной кеш-группе не могут одновременно присутствовать и транзакционный, и атомарный кеши. Подробнее о группах написано в разделе «Кеш-группы».

Режимы атомарности, которые поддерживает DataGrid:

Режим атомарности

Описание

ATOMIC

Режим по умолчанию. Все операции выполняются атомарно, по одной. Транзакции не поддерживаются.

Режим ATOMIC обеспечивает более высокую производительность за счет исключения блокировок транзакций и при этом гарантирует атомарность и согласованность данных для каждой отдельной операции.

Массовые операции, например методы putAll(…) и removeAll(…), не выполняются за одну транзакцию и могут частично завершиться сбоем. В этом случае генерируется исключение CachePartialUpdateException со списком ключей, для которых не удалось выполнить обновление

TRANSACTIONAL

Включает поддержку ACID-транзакций, которые выполняются через Key-Value API. Транзакции SQL не поддерживаются.

В режиме TRANSACTIONAL у транзакций могут быть разные режимы параллелизма и уровни изоляции. Включайте его только в случаях, когда нужна поддержка операций, которые совместимы с ACID. Подробнее о транзакциях и их режимах написано в разделе «Выполнение транзакций»

Внимание

Режим TRANSACTIONAL увеличивает издержки на кеш-операции. Включайте его только в случаях, когда нужны транзакционные гарантии.

Включить поддержку транзакций можно в конфигурации кеша:

  • XML:

    <bean class="org.apache.ignite.configuration.IgniteConfiguration">
        <property name="cacheConfiguration">
            <bean class="org.apache.ignite.configuration.CacheConfiguration">
                <property name="name" value="myCache"/>
    
                <property name="atomicityMode" value="TRANSACTIONAL"/>
            </bean>
        </property>
    
        <!-- Дополнительная конфигурация транзакций по умолчанию. -->
        <property name="transactionConfiguration">
            <bean class="org.apache.ignite.configuration.TransactionConfiguration">
                ...
            </bean>
        </property>
    </bean>
    
  • Java:

    CacheConfiguration cacheCfg = new CacheConfiguration();
    
    cacheCfg.setName("cacheName");
    
    cacheCfg.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
    
    IgniteConfiguration cfg = new IgniteConfiguration();
    
    cfg.setCacheConfiguration(cacheCfg);
    
    // Дополнительная конфигурация транзакций по умолчанию.
    TransactionConfiguration txCfg = new TransactionConfiguration();
    
    cfg.setTransactionConfiguration(txCfg);
    
    // Запустите узел.
    Ignition.start(cfg);
    
  • С#/.NET:

    var cfg = new IgniteConfiguration
    {
        CacheConfiguration = new[]
        {
            new CacheConfiguration("txCache")
            {
                AtomicityMode = CacheAtomicityMode.Transactional
            }
        },
        TransactionConfiguration = new TransactionConfiguration
        {
            DefaultTransactionConcurrency = TransactionConcurrency.Optimistic
        }
    };