NTI Transactions Utility
Extensions to the transaction package.
nti.transactions.transactions.TransactionsLoop is a retryable transaction manager. It is conceptually similar to the attempts context manager provided by the transaction package itself, but much more powerful and extensible via subclasses. Features include:
- Configurable commit vetos.
- Extensible tests for which exceptions should be retried.
- The ability to abort the transaction and bypass a potentially expensive commit when there are expected to be no side-effects.
- Sleeping between retries.
- Extensive logging and timing.
The TransactionLoop can be used as-is, or it can be subclassed for customization. For use in a Pyramid tween, for example, a minimal subclass might look like this:
>>> class PyramidTransactionLoop(TransactionLoop): ... def prep_for_retry(self, number, request): ... request.make_body_seekable() ... def describe_transaction(self, request): ... return request.url
A few data managers are provided for convenience.
The first data manager is used to put an object in a queue (something with the full and put_nowait methods) when a transaction succeeds. If the queue is full, then the transaction will not be allowed to commit:
>>> from nti.transactions.transactions import put_nowait >>> put_nowait(queue, object)
This is a special case of the ObjectDataManager, which will call one method with any arguments when a transaction commits. It can be configured to vote on whether the transaction should be allowed to commit. or not. This is useful for, say, putting an item in a Redis queue when the transaction is successful. It can be constructed directly, but the do function is a shorthand way of joining one to the current transaction:
>>> from nti.transactions.transactions import do >>> do(print, args=("Committed"))
See the documentation of this object for numerous warnings about side-effects and its interaction with the transaction machinery. Use it with care!
- Use the new public isRetryableError in transaction 2.2. The interface for this package is unchanged, but a major version bump of a dependency necessitates a major bump here. See issue 12.
- Test support for Python 3.7; remove test support for Python 3.4.
- TransactionLoop is more careful to not keep traceback objects around, especially on Python 2.
- When the TransactionLoop raises a CommitFailedError from a TypeError, it preserves the original message.
- Test support for Python 3.6.
- Add a new ObjectDataManager that will attempt to execute after other ObjectDataManagers.
- Add support for Python 3.
- Eliminate ZODB dependency. Instead of raising a ZODB.POSException.StorageError for unexpected TypeErrors during commit, the new class nti.transactions.interfaces.CommitFailedError is raised.
- Introduce a new subclass of TransactionError, AbortFailedError that is raised when an abort fails due to a system error.
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
|Filename, size & hash SHA256 hash help||File type||Python version||Upload date|
|nti.transactions-2.0.0-py2.py3-none-any.whl (17.1 kB) Copy SHA256 hash SHA256||Wheel||py2.py3|
|nti.transactions-2.0.0.tar.gz (18.5 kB) Copy SHA256 hash SHA256||Source||None|