--
I started assessing multi-db support in Django 1.5.1, I'm interested in
having read replicas and a write master.
I've figured out all the easy stuff: using TEST_MIRROR in the DATABASES
setting, writing a simple router that splits read and write traffic, all
according to the documentation. I can run a test server and issue some
calls manually, but I have not been able to run simple unit tests.
The most simple test I can build fails during _pre_setup() with a
"TransactionManagementError: Transaction managed block ended with pending
COMMIT/ROLLBACK"
My databases are MySQL EC2 RDS instances, the replication is working fine,
the tables are InnoDB etc.
I know there is active development around transaction management code in
Django lately, so maybe I've stumbled on a bug? I'm attaching a simple
test setup that should make it easy to reproduce.
Any advice would be greatly appreciated.
Cheers,
TTimo
./manage.py test readreplica
Creating test database for alias 'default'...
E
======================================================================
ERROR: testTest (readreplica.tests.Test)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/django/test/testcases.py",
line 240, in __call__
self._pre_setup()
File "/usr/local/lib/python2.7/dist-packages/django/test/testcases.py",
line 462, in _pre_setup
self._fixture_setup()
File "/usr/local/lib/python2.7/dist-packages/django/test/testcases.py",
line 822, in _fixture_setup
if not connections_support_transactions():
File "/usr/local/lib/python2.7/dist-packages/django/test/testcases.py",
line 809, in connections_support_transactions
for conn in connections.all())
File "/usr/local/lib/python2.7/dist-packages/django/test/testcases.py",
line 809, in <genexpr>
for conn in connections.all())
File "/usr/local/lib/python2.7/dist-
packages/django/utils/functional.py", line 48, in __get__
res = instance.__dict__[self.func.__name__] = self.func(instance)
File "/usr/local/lib/python2.7/dist-
packages/django/db/backends/__init__.py", line 627, in
supports_transactions
self.connection.leave_transaction_management()
File "/usr/local/lib/python2.7/dist-
packages/django/db/backends/__init__.py", line 319, in
leave_transaction_management
"Transaction managed block ended with pending COMMIT/ROLLBACK")
TransactionManagementError: Transaction managed block ended with pending
COMMIT/ROLLBACK
----------------------------------------------------------------------
Ran 0 tests in 0.084s
FAILED (errors=1)
Destroying test database for alias 'default'...
--
Ticket URL: <https://code.djangoproject.com/ticket/20373>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
* needs_better_patch: => 0
* needs_tests: => 0
* needs_docs: => 0
Comment:
I'm also experiencing this issue. The ticket has been opened for 7 weeks
without a reply which is a bit concerning :S
--
Ticket URL: <https://code.djangoproject.com/ticket/20373#comment:1>
Comment (by aaugustin):
This cannot be a side effect of the recent work on transaction management,
since that work didn't touch the stable/1.5.x branch.
The previous transaction management was so buggy that it was entirely
removed and replaced. That could explain why there's little interest in
fixing it...
--
Ticket URL: <https://code.djangoproject.com/ticket/20373#comment:2>
* status: new => closed
* resolution: => needsinfo
Comment:
As noted above, please re-open if this is still an issue with Django 1.6.
--
Ticket URL: <https://code.djangoproject.com/ticket/20373#comment:3>
* status: closed => new
* resolution: needsinfo =>
Comment:
I've experienced the same bug on both django 1.5 and django 1.6 I too am
using multi-db read replica with TEST_MIRROR set. If I remove the slave
and the db router the test runs fine.
--
Ticket URL: <https://code.djangoproject.com/ticket/20373#comment:4>
Comment (by anonymous):
Also this captcha like math equation for spam often fails here if the
result is supposed to be a negative number.
--
Ticket URL: <https://code.djangoproject.com/ticket/20373#comment:5>
Comment (by cad106uk):
I had this problem this morning. For me it turned out not to be a problem
with my django install. It turned out to be a problem with my .sqlite3
file. When I deleted this file and ran the tests again the problem went
away.
--
Ticket URL: <https://code.djangoproject.com/ticket/20373#comment:6>
Old description:
New description:
--
Cheers,
TTimo
--
Comment (by aaugustin):
(Fixed formatting.)
--
Ticket URL: <https://code.djangoproject.com/ticket/20373#comment:7>
* status: new => closed
* resolution: => needsinfo
Comment:
After changing the settings file to:
{{{
SECRET_KEY='oh hay this is a test'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django_test',
'USER': 'root',
},
'slave': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django_other',
'USER': 'root',
# https://docs.djangoproject.com/en/dev/topics/testing/advanced
/#topics-testing-masterslave
'TEST_MIRROR' : 'default',
},
}
INSTALLED_APPS = ['readreplica']
}}}
The example works for me on Django 1.7:
{{{
(django-dev)myk@mYk readreplica % ./manage.py test --settings=settings
~/Documents/dev/django/readreplica
Creating test database for alias 'default'...
testTest
.
----------------------------------------------------------------------
Ran 1 test in 0.054s
OK
Destroying test database for alias 'default'...
}}}
Since this was reopened anonymously there's nothing we can do about it.
--
Ticket URL: <https://code.djangoproject.com/ticket/20373#comment:8>