Part of lp.services.database.transaction_policy View In Hierarchy
Context manager for read-only transaction policy.
Use this to define regions of code that explicitly allow or disallow
changes to the database:
# We want to be sure that inspect_data does not inadvertently
# make any changes in the database, but we can't run it on the
# slave store because it doesn't tolerate replication lag.
with DatabaseTransactionPolicy(read_only=True):
inspect_data()
The simplest way to use this is as a special transaction:
* You must commit/abort before entering the policy.
* Exiting the policy through an exception aborts its changes.
* Before completing a read-write policy region, you must commit or abort.
You can also have multiple transactions inside one policy, however; the
policy still applies after a commit or abort.
Policies can be nested--a nested policy overrides the one it's nested in.
After the nested policy has exited, the previous policy applies again:
# This code needs to control the database changes it makes very
# carefully. Most of it is just gathering data, with one quick
# database update at the end.
with DatabaseTransactionPolicy(read_only=True):
data = gather_data()
more_data = figure_stuff_out(data)
# End the ongoing transaction so we can go into our update.
transaction.commit()
# This is the only part where we update the database!
with DatabaseTransactionPolicy(read_only=False):
update_model(data, more_data)
transaction.commit()
# We've got a bit more work to do here, but it doesn't
# affect the database.
write_logs(data)
notify_user(more_data)
| Method | __init__ | Create a policy. |
| Method | __enter__ | Enter this policy. |
| Method | __exit__ | Exit this policy. |
| Method | _isInTransaction | Is our store currently in a transaction? |
| Method | _checkNoTransaction | Verify that no transaction is ongoing. |
| Method | _flushPendingWrites | Flush any pending object changes to the database. |
| Method | _getCurrentPolicy | Read the database session's default transaction read-only policy. |
| Method | _setPolicy | Set the database session's default transaction read-only policy. |
Merely creating a policy has no effect. Use it with "with" to affect writability of database transactions.
| Parameters | store | The store to set policy on. Defaults to the main master store. You don't want to use this on a slave store! |
| read_only | Is this policy read-only? |
Commits the ongoing transaction, and sets the selected default read-only policy on the database.
| Raises | TransactionInProgress | if a transaction was already ongoing. |
Commits or aborts, depending on mode of exit, and restores the previous default read-only policy.
| Returns | True -- any exception will continue to propagate. | |
| Raises | TransactionInProgress | if trying to exit normally from a read-write policy without closing its transaction first. |
| Parameters | error_msg | The error message to use if the user got this wrong (i.e. if we're in a transaction). |
| Raises | TransactionInProgress | if we're in a transaction. |
Flush any pending object changes to the database.
If you see an InternalError exception during this flush, it probably
means one of two things: