Скасувати менеджер¶
Скасування є обов’язковою функцією в сучасних програмах. Гафор не виняток. Наявність функції скасування означає, що ви можете змінити модель і легко повернутися до старішого стану.
Огляд транзакцій¶
Запис і відтворення змін у Gaphor здійснюється за допомогою Менеджера скасувань. Менеджер скасувань працює транзакційно. Транзакція повинна бути успішною або неуспішною як єдине ціле. Якщо транзакція зазнає невдачі в середині, вона відкочується назад. У Gaphor це досягається за допомогою модуля transaction, який надає контекстний менеджер Transaction.
Коли відбуваються транзакції, вони випромінюють події, коли починається і завершується транзакція, що знаходиться зверху. Сповіщення про події стосуються початку транзакції, фіксації транзакції, якщо вона успішна, або відкату транзакції, якщо вона не вдалася.
Менеджер скасувань дозволяє лише вносити зміни в транзакцію. Якщо зміна вноситься поза транзакцією, виникає виняток.
Початок транзакції¶
A
Transactionobject is created.TransactionBeginevent is emitted.The
UndoManagerinstantiates a newActionStackwhich is the transaction object, and adds the undo action to the stack.
Вкладені транзакції підтримуються, щоб дозволити додавати транзакцію всередину іншої транзакції, яка вже виконується.
Успішна транзакція¶
A
TransactionCommitevent is emittedThe
UndoManagercloses and stores the transaction.
Невдала транзакція¶
A
TransactionRollbackevent is emitted.The
UndoManagerplays 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 mark_rollback()[source]¶
Позначте транзакцію для відкату.
Ця операція сама по собі не закриє транзакцію, натомість вона дозволить вам елегантно скасувати зміни.
- rollback()[source]¶
Відкат транзакції.
По-перше, угода закрита. Випускається подія
TransactionRollback.
- class gaphor.event.TransactionBegin(context: str | None)[source]¶
Ця подія означає початок транзакції.
Вкладені (під) транзакції не повинні видавати цей сигнал.