Транзакции как программирование на Java - PullRequest
2 голосов
/ 28 марта 2011

Я хочу достичь транзакции, как функциональность в Java. Я хочу выполнить ` n ', например: одну операцию для обновления базы данных, одну для вставки в очередь, одну операцию для обновления другой структуры данных и т. Д. в случае успеха все операции должны быть успешно выполнены, в противном случае, если произойдет сбой, все должно произойти. Один из подходов грубой силы заключается в написании блоков try-catch и возврате всех операций в блоки catch. Есть какие-то указатели в решении подобных проблем? Есть ли шаблон или библиотека для достижения этого?

Ответы [ 5 ]

5 голосов
/ 28 марта 2011

Нет, вы хотите JTA.

Грубым способом было бы использовать JDBC и самостоятельно управлять фиксацией и откатом.

Самый простой способ - использовать Spring или EJB3.1 и декларативные операции.

1 голос
/ 17 августа 2011

Я сделал это с помощью комбинации команд и шаблонов проектирования.Класс Transaction является абстрактным и содержит методы begin () и rollback ().CompositeTransaction является производным от Transaction и хранит список объектов Transaction.Для каждой группы операций, которые необходимо рассматривать как элементарную транзакцию, создайте подкласс CompositeTransaction и добавьте в него свои классы Transaction.см. CompositeTransaction здесь:

http://hillside.net/plop/plop99/proceedings/grand/plop_99_transaction_patterns.pdf

1 голос
/ 28 марта 2011

Я думаю, что вы ищете шаблон Команда .

Транзакционное поведение

Подобно отмене, ядро ​​базы данных или установщик программного обеспечения могут хранить список операций, которые были или будут выполнены. В случае сбоя одного из них все остальные могут быть отменены или отброшены (обычно это называется откатом). Например, если две таблицы базы данных, которые ссылаются друг на друга, должны быть обновлены, а второе обновление завершилось неудачно, транзакцию можно откатить, чтобы первая таблица не содержала недопустимой ссылки.

0 голосов
/ 28 марта 2011

Это просто логика того, как этого добиться.

Напишите метод для каждой транзакции, как вы хотите. Вероятно, у него есть все свои ресурсы. Подобно тому, как транзакция jdbc будет иметь объект Connection и запрос в качестве требования, файловая операция, если таковая будет иметь путь к файлу, и т. Д.

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

например.

method1(...) throws Exception {
    ...
    // if any exception occurs then control will be passed to caller of this
    // method
    throw new Exception("1"); // write method number
}

Затем напишите метод как (далее просто шаблон):

public long/void transaction(...) throws Exception
{
    try {
        this.method1(...);
        this.method2(...);
        this.method3(...);
    } catch (Exception e) {
        // get that number in a exception message
        // and try to undo all operations numbers less than above number.
        // e.g. if that transaction method is any database transaction then
        // try to rollback it.
        // if it is creation of any file say log file then delete it
        // now further logic depends on what the transaction was and how to
        // undo it...
    }
}

Спасибо.

0 голосов
/ 28 марта 2011

шаблон посетителя работает хорошо. Кроме того, вам необходимо убедиться, что вы выполнили коммит в нужное время. если вы дождетесь завершения набора вставок / обновлений, а затем выполните коммит, ваше описанное поведение должно быть автоматическим.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...