Транзакции в Лотусе

Тема в разделе "Lotus - Программирование", создана пользователем AlexeyStaf, 5 авг 2010.

  1. AlexeyStaf

    AlexeyStaf Гость

    Добрый день!
    Подскажите кто как решает вопрос по реализации транзакционной записи в БД. В большей степени интересует работа через C API, но можно и к LotusScript. Если будут какие-то готовые решения, то вообще замечательно :)
    При создании документов мне видится пока один вариант: отдельно вести список созданных документов, при завершении транзакции очищать этот список. Если транзакция не завершена, то считывать из списка все доки и удалять их из БД.
    С изменениями полей посложнее будет, т.к. надо хранить предыдущие значения. И при откате транзакции может возникнуть ситуация, что мне надо восстановить поле, которое после меня уже кто-то изменил...
    Буду рад любым идеям :)
     
  2. Klido

    Klido Гость

    Что за откат транзакции?
    Что для Вас вообще Транзакция в лотусе? :)
     
  3. AlexeyStaf

    AlexeyStaf Гость

    Мне необходимо произвести запись/изменение нескольких документов. Причем если на каком-то этапе возникла ошибка (отвалился от сервера по таймауту, сеть пропала или еще чего хуже сама программа записи дала сбой), то все действия необходимо отменить. В общем определение прям как для релиционных СУБД, но сделать это надо для Лотуса. Почему - вопрос отдельный :)
     
  4. Klido

    Klido Гость

    сочувствую....
    софтина походу внешняя? ну так и пишите транзакции какие надо куда угодно+данные про лотусиный док (UNID и пр. что надо)... по необходимости - набор обратных операций... но чуднО - всё равно..
     
  5. AlexeyStaf

    AlexeyStaf Гость

    Да, внешняя. Я и просил желательно применительно к Lotus C API. Я думаю, что не я один такой, кто с этим столкнулся - надеялся на может уже есть готовые наработки для этого.
     
  6. Klido

    Klido Гость

    нет разницы тут API или там OLE/COM... надо откатить действия - их надо залогировать согласно алгоритму внешней софтины...
    боюсь вряд ли есть что-то толковое...
    идеология лотуса особо не подразумевает таких манипуляций...ибо
     
  7. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    в простом случае - сохранение всех меняемых доков в ДХЛ, до транзакции, в случае отката - импорт из негоже (с реплейсом текущих)
     
  8. Klido

    Klido Гость

    ну нам же надо знать как обычно:
    - создание (тут для отката просто список UNID-ов и потом удалить по списку)
    - удаление (тут для отката слив в DXL и потом залить)
    - изменение (тут для отката слив в DXL перед изменением, а потом надо проверять не успел ли поменяться, а если успел - значит принимать какие-то решения)

    это для простого случая, но, например, не просто создать, а ещё воркфлоу применить - там и почта полетит и пр.
     
  9. AlexeyStaf

    AlexeyStaf Гость

    Одно только беспокоит не сильно ли ударит по производительности экспорт в DXL? Благо удаления документов не предвидится. Но тем не менее запись полей периодически будет весьма оживленная.
     
  10. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    блокировки могут помочь. суть способа - сохранять изменения одновременно и как можно позже.
    перед изменением документа лочим его, добавляем в коллекцию( класс - обертка, поддерживающая хранение доков из разных БД )
    commit - сохранение коллекции, разлочка
    rollback - просто разлочка.
    это конечно не классическая транзакция, но бОльшая часть проблем у меня решилась.
    блокировка заодно решает проблему, связанную с доступом: когда в процессе сохранения коллекции выясняеца, что у юзера нет прав сохранить предпоследний документ...
    Прямое попадания баллистической ракеты в серверную такая схема конечно не переживет - т.е. от аппаратных/сетевых сбоев в момент сохранения защиты нету, но для обычных задач мне хватало.
     
  11. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    turumbay
    я вот пытаюсь вас понять и не могу
    неужели лотус изменил меня настолько что логика процедур, которые я пишу каждый день уже не должна содержать в себе откат транзакций...
    Что мешает строить свои изменения таким образом, чтобы они продолжались с прерванного места?
    И что плохого что часть данных будет уже новой? уж лучше часть чем вообще ничего
     
  12. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Что плохого, что со счёта покупателя средства списались, а на счёт продавца не поступили? Хотя, конечно, писать на Лотусе банковские и т.п. системы — маразм.
     
  13. Klido

    Klido Гость

    хм... списали - создали док СПИСАНИЕ, ждем пока не поступят средства - создали док ПОСТУПЛЕНИЕ (как ответ списанию, например)...
    если поступления не произошло - док СПИСАНИЕ помечаем неактуальным и заново... не вижу тут никаких откатов транзакций...

    :(
     
  14. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    вообще, транзакции - отличная тема для пятничного флейма. скользкая, неочевидная, с кучей "а вот если так, то..."
    а пока поступления нет - считаем списание актуальным??? :) принцип двойной записи никто не отменял.
    я выписал клиенту накладную: запасы уменьшились, дебиторка выросла. И меня не устроит, что товар уже списался, а баланс клиента еще не изменился. Если это произошло - система находится в некорректном состоянии. То, что систему переодически можно проверять на целостность - проблему смягчает, но не решает.

    речь о том, что бывает ситуация, когда нужно изменить два документа одновременно, в рамках одной "транзакции". И домино не предоставляет этого функционала. Чтоб ни накручивали - всегда в результате будет два последовательных вызова doc.save. И нет возможность обеспечить атомарность такой операции.Т.е. проблема - системная. Ее можно всячески смягчать( блокировки, доп. проверки и т.п. ), но чистого решения нет.
    это верно, мягко говоря, не всегда.
     
  15. Mikle0x

    Mikle0x Member

    Регистрация:
    1 апр 2010
    Сообщения:
    14
    Симпатии:
    2
    Имхо, по большому счёту надо писать серверную задачу для домины, которая будет перехватывать обращения к документам и реализовывать "промежуточный слой" с возможностью откатить операции, при желании. Аппаратные сбои должен обрабатывать лотусовый журнал транзакций.
    Но это сложно, имхо на энтузиазме даже тех.задание нормальное не получится :sorry:
     
  16. Klido

    Klido Гость

    Пт - не догоняю что именно вы там делаете :sorry:
    если в пределах домино - тут и так все ясно..
    Речь идет о некоей внешней софтине, которая по каким-то своим событиям дергает лотус... А тут атомарность транзакции размыта: есть транзакция внешней софтины, есть транзакция коммуникации с лотусом, есть транзакция действия в лотусе... Не вижу что может помешать в рамках одной внешней транзакции выполнить N транзакций в лотусе.
    Внешние транзакции вообще тупо ставят некий признак в доках лотуса (у меня так с 1С - там проводки, отправки в клиент-банк, прием выписок банка и пр.), а лотусина уже обрабатывает признаки как её надо...

    Как по мне - тема явно из-за попыток лотус заставить делать реляционные дела (с соответствующим подходом)
     
Загрузка...

Поделиться этой страницей