Библиотека коллекций с поддержкой commit()/rollback()
От: andyag  
Дата: 21.12.14 10:03
Оценка: 13 (2)
А не встречал ли кто библиотеку, реализующую коллекции с поддержкой транзакций? Причём не обязательно даже чтобы поддержка concurrency была. Хочется примерно вот такого:
TransactionalList<Integer> list = new TransactionalList<Integer>();
list.begin();    // []
  list.begin();  // []
    list.add(1); // [1]
    assertEquals(1, list.size());
  list.commit(); // [1]
  list.begin();  // [1]
    list.add(2); // [1, 2]
    assertEquals(2, list.size());
  list.commit(); // [1, 2]
list.rollback(); // []
assertEquals(0, list.size());
Re: Библиотека коллекций с поддержкой commit()/rollback()
От: . Великобритания  
Дата: 21.12.14 13:17
Оценка: 10 (1)
Здравствуйте, andyag, Вы писали:

a> А не встречал ли кто библиотеку, реализующую коллекции с поддержкой транзакций? Причём не обязательно даже чтобы поддержка concurrency была. Хочется примерно вот такого:

Можно взять стек неизменяемых списков
import org.pcollections.PVector;
import org.pcollections.TreePVector;

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.List;

public class TransactionalList<E>
{
    final Deque<PVector<E>> data = new ArrayDeque<>();

    public TransactionalList()
    {
        data.addFirst(TreePVector.<E>empty());
    }

    public void add(E e)
    {
        data.addFirst(data.removeFirst().plus(e));
    }

    public void begin()
    {
        data.addFirst(data.getFirst());
    }

    public void rollback()
    {
        data.removeFirst();
    }

    public void commit()
    {
        final PVector<E> newHead = data.removeFirst();
        data.removeFirst();//old head dropped
        data.addFirst(newHead);
    }

    public int size()
    {
        return data.getFirst().size();
    }

    public List<? extends E> data()
    {
        return data.getFirst();
    }
}

ну и юнит-тест
import org.junit.Test;

import static java.util.Arrays.asList;
import static org.junit.Assert.assertEquals;

public class TransactionalListTest
{
    @Test
    public void testAdd() throws Exception
    {
        TransactionalList<Integer> list = new TransactionalList<Integer>();
        list.begin();    // []
        list.begin();  // []
        list.add(1); // [1]
        assertEquals(1, list.size());
        assertEquals(asList(1), list.data());
        list.commit(); // [1]
        list.begin();  // [1]
        list.add(2); // [1, 2]
        assertEquals(asList(1, 2), list.data());
        assertEquals(2, list.size());
        list.commit(); // [1, 2]
        list.rollback(); // []
        assertEquals(0, list.size());
    }
}

С concurrency непонятно что делать. Ведь begin-commit из разных потоков пускать не получится. По-моему можно сделать только саму модификацию списка, через CAS делать замену вершины стека.
avalon/1.0.432
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: Библиотека коллекций с поддержкой commit()/rollback()
От: Pavel Dvorkin Россия  
Дата: 21.12.14 16:39
Оценка:
Здравствуйте, andyag, Вы писали:

A>А не встречал ли кто библиотеку, реализующую коллекции с поддержкой транзакций? Причём не обязательно даже чтобы поддержка concurrency была. Хочется примерно вот такого:


Посмотри вот это

http://tomee.apache.org/examples-trunk/transaction-rollback/README.html
With best regards
Pavel Dvorkin
Re[2]: Библиотека коллекций с поддержкой commit()/rollback()
От: andyag  
Дата: 21.12.14 20:47
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, andyag, Вы писали:


A>>А не встречал ли кто библиотеку, реализующую коллекции с поддержкой транзакций? Причём не обязательно даже чтобы поддержка concurrency была. Хочется примерно вот такого:


PD>Посмотри вот это


PD>http://tomee.apache.org/examples-trunk/transaction-rollback/README.html


Там какие-то тесты про JPA и транзакции. Что именно предлагалось посмотреть?
Re[2]: Библиотека коллекций с поддержкой commit()/rollback()
От: andyag  
Дата: 21.12.14 21:02
Оценка:
Здравствуйте, ., Вы писали:

.>Здравствуйте, andyag, Вы писали:


a>> А не встречал ли кто библиотеку, реализующую коллекции с поддержкой транзакций? Причём не обязательно даже чтобы поддержка concurrency была. Хочется примерно вот такого:

.>Можно взять стек неизменяемых списков
...
.>С concurrency непонятно что делать. Ведь begin-commit из разных потоков пускать не получится. По-моему можно сделать только саму модификацию списка, через CAS делать замену вершины стека.

Да вот как раз было сильное желание не делать велосипед, т.к. это маленькая часть от задачки, которую хотелось решить "перед завтраком"
Re[3]: Библиотека коллекций с поддержкой commit()/rollback()
От: . Великобритания  
Дата: 21.12.14 21:09
Оценка:
Здравствуйте, andyag, Вы писали:

a> .>С concurrency непонятно что делать. Ведь begin-commit из разных потоков пускать не получится. По-моему можно сделать только саму модификацию списка, через CAS делать замену вершины стека.


a> Да вот как раз было сильное желание не делать велосипед, т.к. это маленькая часть от задачки, которую хотелось решить "перед завтраком"

Вряд ли есть что-то сразу готовое, ибо довольно специфическое требование, а универсальное решение будет неэффективным, как мне кажется.
Поэтому попробуй свою задачу через другие абстракции выразить, не через STM, а, скажем, через специальную структуру данных.
avalon/1.0.432
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: Библиотека коллекций с поддержкой commit()/rollback()
От: sergmalinin  
Дата: 29.12.14 08:09
Оценка:
Здравствуйте, andyag, Вы писали:

A>А не встречал ли кто библиотеку, реализующую коллекции с поддержкой транзакций? Причём не обязательно даже чтобы поддержка concurrency была. Хочется примерно вот такого:

В MapDb есть коллекции с транзакциями, если база будет InMemory то на диск ничего писаться не будет.
https://github.com/jankotek/mapdb
Re: Библиотека коллекций с поддержкой commit()/rollback()
От: kuaw26 Россия  
Дата: 10.01.15 03:07
Оценка:
Здравствуйте, andyag, Вы писали:

A>А не встречал ли кто библиотеку, реализующую коллекции с поддержкой транзакций? Причём не обязательно даже чтобы поддержка concurrency была. Хочется примерно вот такого:

Можешь попробовать GridGain (это in-memory cache) в нем есть транзакционный режим кеша.
Но это может сильно "тяжеловесное" решение в вашем случае.
Re[2]: Библиотека коллекций с поддержкой commit()/rollback()
От: andyag  
Дата: 10.01.15 09:29
Оценка:
Здравствуйте, kuaw26, Вы писали:

K>Здравствуйте, andyag, Вы писали:


A>>А не встречал ли кто библиотеку, реализующую коллекции с поддержкой транзакций? Причём не обязательно даже чтобы поддержка concurrency была. Хочется примерно вот такого:

K>Можешь попробовать GridGain (это in-memory cache) в нем есть транзакционный режим кеша.
K>Но это может сильно "тяжеловесное" решение в вашем случае.

Не, это однозначно оверкил Пока сделал в лоб — Mememento через сериализацию + складываю в стек. Хочется что-то примерно такого уровня, лишь бы не писать руками.
Re: Библиотека коллекций с поддержкой commit()/rollback()
От: pestis  
Дата: 10.01.15 12:02
Оценка:
Здравствуйте, andyag, Вы писали:

A>А не встречал ли кто библиотеку, реализующую коллекции с поддержкой транзакций? Причём не обязательно даже чтобы поддержка concurrency была. Хочется примерно вот такого:


http://en.wikipedia.org/wiki/Software_transactional_memory#Java
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.