﻿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
32527	needs_rollback flag issue with implementation of backend that does not support savepoint	Hemant Bhanawat	nobody	"I am implementing a backend for Yugabyte. Yugabyte currently doesn't support savepoints. Hence, in the backend, I have set uses_savepoints= False 

However, while running the test. I hit the following issue. 

The error: ""TransactionManagementError: An error occurred in the current transaction. You can't execute queries until the end of the 'atomic' block.""  

On some investigation, I found that this exception is thrown if self.needs_rollback is True. The first test that uses savepoint passes successfully. However, the second test has needs_rollback set as true and hits this exception. 

The problem stems from the following code of __enter__ function in transaction.py 

            if self.savepoint and not connection.needs_rollback:
                sid = connection.savepoint()
                connection.savepoint_ids.append(sid)
            else:
                connection.savepoint_ids.append(None)

Basically, a None is inserted in the savepoint_ids when the savepoints are not supported. And the following code in __exit__ function of transaction.py, it sets needs_rollback as true:

                    if sid is None:
                        connection.needs_rollback = True

Can someone please clarify if this is an issue with the code or there is something else that we can do at our layer. For the time being, we have overridden the function savepoint of DatabaseWrapper to return 1. And, we ask the users of our backend to not set savepoint=true in parameters of transaction.atomic(). 

    def savepoint(self):
             return 1 "	Bug	new	Database layer (models, ORM)	dev	Normal		savepoint needs_rollback database backend		Unreviewed	0	0	0	0	0	0
