After few failed attempt to propose Autonomous transaction earlier. I along
with Simon Riggs would like to propose again but completely different in
approach.
We also had discussion about this feature in last PGCon2015 Unconference Day,
those who missed this discussion, please refer
https://wiki.postgresql.org/wiki/AutonomousTransactionsUnconference2015
Before jumping into the design and code proposal for this feature, me along
with Simon Riggs wanted to propose its behavior and usage to keep everyone in
the same boat.
So we have summarized the behavior and usage of the Autonomous Transaction
based on the discussion with community members in last PGCon2015 Unconference
Day:
Behavior of Autonomous Transaction:
1. The autonomous transaction treated as a completely different
transaction from the master transaction.
2. It should be allowed to deadlock with master transaction. We need
to work-out a solution to avoid deadlock.
3. It can support multiple level of nesting based on the
configuration (may be max as 70).
4. Outer (i.e. main or upper autonomous) transaction to be suspended
while the inner autonomous transaction is running.
5. Outer transaction should not see data of inner till inner is
committed (serializable upper transaction should not see even after inner
transaction commit).
How to Use Autonomous Transaction:
1. We can issue explicit command to start an Autonomous transaction as below:
BEGIN AUTONOMOUS TRANSACTION (Don't worry about keywords at
this point.)
Do you work.
COMMIT/ROLLBACK (Will commit/rollback the autonomous
transaction and will return to main transaction or upper autonomous
transaction).
2. The above commands can be issued either inside the procedure to make few
statements of procedure inside autonomous transaction or even in stand-alone
query execution.
3. We can make whole procedure itself as autonomous, which will be similar to
start autonomous transaction in the beginning of the procedure and
commit/rollback at the end of the procedure.
There was another discussion in Unconference Day to decide whether to implement
COMMIT/ROLLBACK inside the procedure or autonomous transaction. So our opinion
about this is that
COMMIT/ROLLBACK inside procedure will be somewhat different
from Autonomous Transaction as incase of first, once we commit inside the
procedure,
it commits everything done before call of procedure. This is the behavior of
Oracle.
So in this case user required to be very careful to not do any operation before
call of procedure, which is not yet intended to be committed inside procedure.
So we can prefer to implement Autonomous Transaction, which will not only be
compatible with Oracle but also gives really strong required features.
I have not put the use-cases here as already we agree about its strong
use-cases.
Requesting for everyone's opinion regarding this based on which we can proceed
to enhance/tune/re-write our design.
Thanks and Regards,
Kumar Rajeev Rastogi