id,summary,reporter,owner,description,type,status,component,version,severity,resolution,keywords,cc,stage,has_patch,needs_docs,needs_tests,needs_better_patch,easy,ui_ux 2227,transaction.commit()/rollback() should be aware of nested calls to transaction.managed(True),mderk@…,Aymeric Augustin,"As I see in the transaction.py, commit()/rollback() call connection._commit()/connection._rollback() explicitly. It breaks the case when a function with commit_manually or commit_on_success decorator calls another function decorated the same way (enters the transaction management). Consider following scenario: {{{ # a bank account class class Account: @transaction.commit_on_success def withdraw(self, sum): # code to withdraw money from the account @transaction.commit_on_success def add(self, sum): # code to add money to the account # somewhere else @transaction.commit_on_success def makeMoneyTransaction(from_account, to_account, sum): # this code will call commit on success from_account.withdraw(sum) # this code may raise an exception, and if it raises, # commit won't be called in Account.add() and makeMoneyTransaction() # But money had been already withdrawn, and the from_account saved in the database. # The makeMoneyTransaction's transaction is inconsistent. # So we loose our money to_account.add(sum) }}} IMO, what the transaction.commit should do in this case is to check first whether the transaction is ""nested"". In the [http://adodb.sourceforge.net/ AdoDB] PHP library, each call to StartTrans either starts new transaction or increments the counter of the nested StartTrans calls. CompleteTrans either calls commit/rollback (if its StartTrans counterpart was not called inside another StartTrans/CompleteTrans block) or decrements the counter. I rate this deficiency as major. What do you think?",New feature,closed,"Database layer (models, ORM)",dev,Normal,fixed,"transaction, nest, scope, nested, rollback, commit",md@… research@… hv@… aball@… Forest Bond Walter Doekes Dave Hall vlastimil.zima@… Steve Jalim ionel.mc@… mmitar@…,Accepted,1,0,0,1,0,0