Atomicidade em transação (não está fazendo rollback)

99 views
Skip to first unread message

Taiza Montenegro

unread,
Sep 8, 2015, 3:39:02 PM9/8/15
to django...@googlegroups.com
Olá pessoal. 

Estou com dificuldade em fazer uma transação atômica.
Estou usando Django Allauth para customização do usuário. Então quero que no momento do cadastro do usuário, o User só seja criado no banco se não der problema no meu Profile customizado (classe Pessoa). Atualmente, mesmo dando erro no momento de criar a Pessoa, o usuário continua ficando no banco, mesmo eu colocando a anotação @transaction.atomic().

Tb ja tentei tirando a anotacao e colocando  "with transaction.atomic():  " e continua não dando certo.

O código relevante está aqui: 


Estou usando Django 1.6 e banco MySql. Li que pode ter a ver com o tipo de tabelo no banco, mas minhas tabelas estão com engine "InnoDB".

Alguém pode me dar uma luz do que estou errando, por favor?

--
Taíza Rabello Montenegro
Analista de T.I
Superintendência de Informática/UFRN

Ezequiel Bertti

unread,
Sep 8, 2015, 4:15:29 PM9/8/15
to django...@googlegroups.com
Acredito que na função signup a instancia de user já tenha sido passada como parâmetro já salvada no banco.


Para validar o que estou falando, experimente mudar um atributo de user dentro da função signup e ver se essa informação estará salva na tabela no banco de dados.

Abraços



--
Você recebeu essa mensagem porque está inscrito no grupo "Django Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para django-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Ezequiel Bertti
E-Mail: ebe...@gmail.com
Cel: (21) 99188-4860

Rafael dos Santos Gonçalves

unread,
Sep 8, 2015, 4:15:43 PM9/8/15
to django...@googlegroups.com
Você não teria como fazer essa validação via form?

--
Você recebeu essa mensagem porque está inscrito no grupo "Django Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para django-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Rafael dos Santos Gonçalves
Ramal - 6757

Taiza Montenegro

unread,
Sep 8, 2015, 7:59:05 PM9/8/15
to django...@googlegroups.com
O que está acontecendo é exatamente isso, Ezequiel.... o user já foi salvo no banco antes de entrar na função signup! (Como nao pensei nisso antes? hehhehe). 

Rafael, nao entendi.. que validacao vc fala?

Obrigada pela ajuda!

Att.

Ezequiel Bertti

unread,
Sep 8, 2015, 8:34:40 PM9/8/15
to django...@googlegroups.com

2015-09-08 20:58 GMT-03:00 Taiza Montenegro <taizar...@gmail.com>:
Rafael, nao entendi.. que validacao vc fala?

Acho que ele queria dizer de checar se o profile.nome é None:


Para vc validar isso no form, e não no meio da transação.

Taiza Montenegro

unread,
Sep 9, 2015, 7:11:49 AM9/9/15
to django...@googlegroups.com
Ahh sim.. eu coloquei essa linha só pra forçar o erro! Mas meu objeto já está todo validado anteriormente. Porém, teve uma ocasião q a validação passou tudo ok, mas deu outro erro qdo fui salvar o objeto no banco (só que não to lembrada qual erro deu) e acabou salvando o usuário mas não o profile. Por isso queria fazer o rollback só pra garantir que nunca vai acontecer de ter usuário cadastrado sem a pessoa associada.

Acho que a solução melhor seria ver como o Django-Allauth funciona para evitar que o usuário seja salvo antes.. mas eqto isso, eu resolvi temporariamente, mandando ele apagar o usuário caso ocorra algum erro no momento de salvar a pessoa (não sei se é muita gambiarra =/)

Att.


--
Você recebeu essa mensagem porque está inscrito no grupo "Django Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para django-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Ezequiel Bertti

unread,
Sep 9, 2015, 1:21:53 PM9/9/15
to django...@googlegroups.com
Chegou a dar uma olhada nisto:


Você pode criar um provider que faz a criação do User, e neste momento, vc poderia criar o profile em uma transação atômica.

Rafael dos Santos Gonçalves

unread,
Sep 9, 2015, 1:31:14 PM9/9/15
to django...@googlegroups.com
Eu falei outra coisa, pq tinha entendido outra coisa :D

Segue o Ezequiel que vc vai se dar bem :D

abs

Taiza Montenegro

unread,
Sep 9, 2015, 6:51:29 PM9/9/15
to django...@googlegroups.com
Nao tinha visto isso, Ezequiel, vou ver =)
Valeu pela ajuda, pessoal!

Edgar Gabaldi

unread,
Sep 10, 2015, 7:54:43 AM9/10/15
to django...@googlegroups.com
Você colocou no settings  a configuração do database: ATOMIC_REQUESTS = True ?

Sinval Júnior

unread,
Sep 10, 2015, 8:39:11 AM9/10/15
to django...@googlegroups.com
Taiza, coloque o "decorator" em sua view.

Ao encaminhar esta mensagem, por favor:
1 - Apague meu endereço eletrônico;
2 - Encaminhe como Cópia Oculta (Cco ou BCc) aos seus destinatários. Dificulte assim a disseminação de vírus, spams e banners.

#=================================================================+
#!/usr/bin/env python
nome = 'Sinval Júnior'
email = 'sinvalju arroba gmail ponto com'
print nome
print email
#==================================================================+

Sinval Júnior

unread,
Sep 10, 2015, 9:01:05 AM9/10/15
to django...@googlegroups.com
No meu caso geralmente gosto de fazer assim

with transaction.atomic():

pois consigo tratar a except

Ao encaminhar esta mensagem, por favor:
1 - Apague meu endereço eletrônico;
2 - Encaminhe como Cópia Oculta (Cco ou BCc) aos seus destinatários. Dificulte assim a disseminação de vírus, spams e banners.

#=================================================================+
#!/usr/bin/env python
nome = 'Sinval Júnior'
email = 'sinvalju arroba gmail ponto com'
print nome
print email
#==================================================================+

Reply all
Reply to author
Forward
0 new messages