PROBLEMAS COM BEGIN TRANSACTION, COMMIT E ROLLBACK

DAMASCENO.CESAR 21/03/2016 11:20:19
#459559
Bom dia, tenho uma classe de conexão, a qual peguei na net, que também executa as consultas MySql, mas quando tento usar
o rollback , não funciona, vou postar a classe de conexao e como façõ para usar o begin. commit e rollback, se puderem me dizer onde está o erro!
obrigado desde já



Citação:

Public Function Salva_Recibo(ByVal _rec1 As Recibo1, ByVal _rec As List(Of Recibo)) As Boolean
Dim Objdb As New AcessoDados
Dim sSql As String
Try
sSql = [Ô]INSERT INTO recibo1(Procedente, OBS, NUMERO, motivincl) VALUES([ô][Ô] & _rec1.Procedente & [Ô][ô], [ô][Ô] & _rec1.obs & [Ô][ô], [ô][Ô] _
& _rec1.NUMERO & [Ô][ô], [ô][Ô] & _rec1.motivincl & [Ô][ô]);[Ô]
Objdb.BeginTransaction()
Objdb.ExecutaConsulta(sSql)
Dim a
For a = 0 To _rec.Count - 1
sSql = [Ô]INSERT INTO recibo(Id, nome, rg, pai, mae, NUMERO) VALUES([ô][Ô] & _rec.Item(a).Rg & [Ô][ô], [ô][Ô] & _rec.Item(a).nome & [Ô][ô], [ô][Ô] _
& _rec.Item(a).rgoumatr & [Ô][ô], [ô][Ô] & _rec.Item(a).pai & [Ô][ô], [ô][Ô] & _rec.Item(a).mae & [Ô][ô], [ô][Ô] & _rec.Item(a).NUMERO & [Ô][ô]);[Ô]
Objdb.ExecutaConsulta(sSql)
Next
Objdb.CommitTransaction()
Return True
Catch ex As Exception
Objdb.RollBackTransaction()
Objdb.CloseConn()
Throw ex
Return False
End Try
End Function



DS2T 21/03/2016 11:53:44
#459565
Aparentemente o código está correto. Se der algum erro, deveria fazer Rollback, mas se vai funcionar... depende de como foi implementado isso daí na classe de AcessoDados.
Isso me fez lembrar do excelente projeto que um colega nosso postou aqui esses dias:

http://www.vbmania.com.br/index.php?modulo=forum&metodo=abrir&id=458959&pagina=1

Tem controle de transações também, talvez você queira dar uma olhada.
MESTRE 21/03/2016 11:54:17
#459567
Qual a exception ?

Veja ex Macoratti
DAMASCENO.CESAR 21/03/2016 14:00:37
#459579
desculpa mestre, não expliquei direito, o que acontece é que quando dá erro, não acontece o rollback
Na função que postei para salvar os dados, dou um while no list pra salvar varios dados ao mesmo tempo e se der algum erro, aparece o exception de boa, mas não retorna o banco de dados ao estado original, os registros que foram mandados gravar antes do erro, continuam.
Acho que é falha minha em não saber como realmente funciona o rollback o begin e o commit
DAMASCENO.CESAR 21/03/2016 14:03:03
#459580
DS2T, acho que o problema e como está implementado na classe AcessoDados, como sou iniciante em banco de dados e se você puder dar uma olhada na classe e me dizer quais tipos de alteração devo fazer... Não espero código pronto, apenas qual caminho logico a seguir.
DS2T 21/03/2016 15:09:54
#459589
Dei uma olhada na classe.
Só pra ter certeza sobre a condição do código, faça um teste:

Tenta adicionar os dados de forma que não cause nenhum erro, para dar Commit. Deixa um breakpoint em cima do Commit.
Quando o breakpoint disparar, veja se o banco de dados já foi preenchido (pois, teoricamente, só era pra preencher depois da transação ser concluída).
Se o banco não tiver com os dados, ótimo. Sinal que suas instruções estavam dentro da transação. Aí executa o Commit e verifica. Se tudo funcionar como esperado, menos mal.

Minha desconfiança, é que a transação não esteja acontecendo. Uma vez que tivermos certeza que as instruções estão mesmo em transação, aí vou tentar entender porque o Commit tá funcionando e o Rollback não.
DAMASCENO.CESAR 21/03/2016 15:25:11
#459592
blz DS2T, vou testar aqui, depois posto a resposta
DAMASCENO.CESAR 21/03/2016 15:41:01
#459597
DS2T, a consulta está preenchendo o Banco de dados antes de executar o commit.
Coloquei um breakpoint no begin e fui seguindo as linhas, não me fez muito sentido a rotina, acho a a classe AcessoDados deve estar incompleta ou com falhas graves rsrsrs
DS2T 21/03/2016 15:56:31
#459598
Como eu suspeitava, mas é estranho do mesmo jeito hehehe Vendo seu código, não parece estar com problema.

Tentar fazer mais testes:
1 - Coloque um breakpoint nessa linha e verifique o valor que o [Ô]trans[Ô] tá retornando;

        trans = conn.BeginTransaction()  



2 - No ExecutaConsulta, verifica se o valor da transação está indo com o valor, nessa linha:

cmd.Transaction = trans



Aparentemente, está tudo correto... só se tiver alguma mudança de variável que não me atentei...
DAMASCENO.CESAR 21/03/2016 16:07:34
#459599
testando
DAMASCENO.CESAR 21/03/2016 16:25:17
#459601
dá uma olhada, não consegui entender os valores rsrs
Página 1 de 2 [16 registro(s)]
Tópico encerrado , respostas não são mais permitidas