Kontrolowany blok transakcji Django zakończył się odroczoną fiksowaniem (zatwierdzenie)/wycofywanie


Mam funkcję reprezentacji, która jest ręcznie sterowana przez transakcję, ale kiedy używam
@ Transaction.comMIT_Manally
Decorator, Django zawsze wywołuje powyższy wyjątek.
Jak widać z poniższego kodu śledzenia, transakcja jest ustalona bezpośrednio przed powrotem z widoku.
Używam sqlite, zarówno w systemie Windows, jak i Linux, z django 1.4.
Poniżej znajduje się wyjście Django_trace, a następnie wyjątek. Być jasnym: tak się dzieje, niezależnie od I używam Django_trace lub nie, a gdy nie ma dekoratorów, nie ma wyjątków. Nie jest to spowodowane wyjątkiem "połknięcia".
Zwróć uwagę, że wiersz 60 poniżej znajduje się wewnątrz procesora kontekstu, a zatem poza widokiem
commit_manually
-wrapped.
01->mainapp.views:1321: transaction.commit()
01->mainapp.views:1322: return render_to_response('mainapp/templates/incorporate.html',
01->mainapp.views:1323: RequestContext(request, form_params))
02-->mainapp.views:60: transaction.rollback_unless_managed()
02-->mainapp.views:61: return {'home_login_form': AuthenticationForm(request)}
Traceback (most recent call last):
File "C:\Users\Marcin\Documents\oneclickcos\lib\site-packages\django\contrib\staticfiles\handlers.py", line 67, in __call__
return self.application(environ, start_response)
File "C:\Users\Marcin\Documents\oneclickcos\lib\site-packages\django\contrib\staticfiles\handlers.py", line 67, in __call__
return self.application(environ, start_response)
File "C:\Users\Marcin\Documents\oneclickcos\lib\site-packages\django\core\handlers\wsgi.py", line 241, in __call__
response = self.get_response(request)
File "C:\Users\Marcin\Documents\oneclickcos\lib\site-packages\django\core\handlers\base.py", line 179, in get_response
response = self.handle_uncaught_exception(request, resolver, sys.exc_info())
File "C:\Users\Marcin\Documents\oneclickcos\lib\site-packages\django\core\handlers\base.py", line 221, in handle_uncaught_exception
return debug.technical_500_response(request, *exc_info)
File "C:\Users\Marcin\Documents\oneclickcos\lib\site-packages\django\core\handlers\base.py", line 111, in get_response
response = callback(request, *callback_args, **callback_kwargs)
File "C:\Users\Marcin\Documents\oneclickcos\oneclickcos\mainapp\decorators.py", line 26, in _wrapped_view
return view_func(request, *args, **kwargs)
File "C:\Users\Marcin\Documents\oneclickcos\lib\site-packages\django\db\transaction.py", line 209, in inner
return func(*args, **kwargs)
File "C:\Users\Marcin\Documents\oneclickcos\lib\site-packages\django\db\transaction.py", line 203, in __exit__
self.exiting(exc_value, self.using)
File "C:\Users\Marcin\Documents\oneclickcos\lib\site-packages\django\db\transaction.py", line 288, in exiting
leave_transaction_management(using=using)
File "C:\Users\Marcin\Documents\oneclickcos\lib\site-packages\django\db\transaction.py", line 52, in leave_transaction_management
connection.leave_transaction_management()
File "C:\Users\Marcin\Documents\oneclickcos\lib\site-packages\django\db\backends\__init__.py", line 119, in leave_transaction_management
raise TransactionManagementError("Transaction managed block ended with "
TransactionManagementError: Transaction managed block ended with pending COMMIT/ROLLBACK

Żeby było jasne, sprawdziłem inne pytania na ten temat i nie mają one rozwiązania mojego problemu.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Okazuje się, że renderowanie szablonu było dostęp do bazy danych, więc zwykły szablon taki jak:
return render_to_response('mainapp/templates/incorporate.html',
RequestContext(request, form_params))

To była przyczyna problemu. Musiałem go zastąpić:
retval = render_to_response('mainapp/templates/incorporate.html',
RequestContext(request, form_params))
transaction.commit()
return retval

Ponadto inne, więc odpowiedzi pokazują, że dekoratorzy kontroli transakcji

ukryj wszystkie wyjątki

A zamiast tego powodować wykluczenie zarządzania transakcją. Niestety, najłatwiejszym sposobem na zdiagnozowanie go jest uruchomienie bez dekoratora i sprawdź, czy wystąpi wyjątek lub owinąć cały widok próbowania/z wyjątkiem.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Arbiter

dok
https://docs.djangoproject.com ... llyJeśli widok zmienia dane i nie zawiera commit () ani rollback (), to Django wyrzuci TransactionManagementError.

Masz więc zmianę w transakcji i musisz wycofać lub zatwierdzić (zatwierdzić) przed ostatnią kasą.
transaction.rollback_unless_managed ()
nie zadziała, ponieważ transakcja znajduje się wewnątrz
commit_manually   
kontrolowany

.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Miałem ten problem i rozwiązałem go, dekorując procesor kontekstu
transaction.commit_on_success
jak
@transaction.commit_manually
def my_view(request):
...
transaction.commit()
return render_to_response("template.html", context_instance=RequestContext(request, my_ctx))
@transaction.commit_on_success
def my_context_processor(request):
...

Nawet czytanie bazy danych wymaga mocowania (zatwierdzenie)/wycofywanie (w tym wewnątrz procesora kontekstowego)

https://docs.djangoproject.com ... dling
https://docs.djangoproject.com ... dling

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się