Скасувати менеджер

Скасування є обов’язковою функцією в сучасних програмах. Гафор не виняток. Наявність функції скасування означає, що ви можете змінити модель і легко повернутися до старішого стану.

Огляд транзакцій

Запис і відтворення змін у Gaphor здійснюється за допомогою Менеджера скасувань. Менеджер скасувань працює транзакційно. Транзакція повинна бути успішною або неуспішною як єдине ціле. Якщо транзакція зазнає невдачі в середині, вона відкочується назад. У Gaphor це досягається за допомогою модуля transaction, який надає контекстний менеджер Transaction.

Коли відбуваються транзакції, вони випромінюють події, коли починається і завершується транзакція, що знаходиться зверху. Сповіщення про події стосуються початку транзакції, фіксації транзакції, якщо вона успішна, або відкату транзакції, якщо вона не вдалася.

Менеджер скасувань дозволяє лише вносити зміни в транзакцію. Якщо зміна вноситься поза транзакцією, виникає виняток.

Початок транзакції

  1. A Transaction object is created.

  2. TransactionBegin event is emitted.

  3. The UndoManager instantiates a new ActionStack which is the transaction object, and adds the undo action to the stack.

Вкладені транзакції підтримуються, щоб дозволити додавати транзакцію всередину іншої транзакції, яка вже виконується.

Успішна транзакція

  1. A TransactionCommit event is emitted

  2. The UndoManager closes and stores the transaction.

Невдала транзакція

  1. A TransactionRollback event is emitted.

  2. The UndoManager plays back all the recorded actions, but does not store it.

API транзакцій

Примітка

Вам потрібні транзакції, лише якщо активний менеджер скасування.

class gaphor.transaction.Transaction(event_manager, context: str | None = None)[source]

Транзакція.

На початку та в кінці транзакції генерується подія. Транзакції можуть бути вкладеними. Події генеруються лише тоді, коли починається та закінчується зовнішня транзакція.

Зверніть увагу, що транзакції є глобальною конструкцією.

>>> import gaphor.core.eventmanager
>>> event_manager = gaphor.core.eventmanager.EventManager()

Транзакції можуть бути вкладеними. Якщо зовнішня транзакція фіксується або відкочується, виникає подія.

Найзручніше використовувати Transaction як контекстний менеджер:

>>> with Transaction(event_manager) as ctx:
...     ... # do actions
...     # in case the transaction should be rolled back:
...     ctx.rollback()

Події можна обробляти програмно, хоча це не рекомендується:

>>> tx = Transaction(event_manager)
>>> tx.commit()
commit()[source]

Зафіксуйте транзакцію.

Транзакцію закрито. Випускається подія TransactionCommit. Якщо транзакцію потрібно відкотити, натомість створюється подія TransactionRollback.

classmethod in_transaction() bool[source]

Ви працюєте всередині транзакції?

classmethod mark_rollback()[source]

Позначте транзакцію для відкату.

Ця операція сама по собі не закриє транзакцію, натомість вона дозволить вам елегантно скасувати зміни.

rollback()[source]

Відкат транзакції.

По-перше, угода закрита. Випускається подія TransactionRollback.

class gaphor.event.TransactionBegin(context: str | None)[source]

Ця подія означає початок транзакції.

Вкладені (під) транзакції не повинні видавати цей сигнал.

class gaphor.event.TransactionCommit(context: str | None)[source]

Ця подія виникає, коли транзакція (верхнього рівня) успішно фіксується.

class gaphor.event.TransactionRollback(context: str | None)[source]

Ця подія сповіщає про помилку операції.

Якщо набір операцій не вдається (тобто через виняток), транзакцію слід позначити для відкоту.

Список літератури