none
Dúvida Transaction Ado.net RRS feed

  • Pergunta

  • Boa tarde, estou com uma dúvida de Ado.Net e transação, minha dúvida seria o seguinte:

    Preciso fazer uma consulta futura dos lançamentos que estão na transaction, isso seria possível ou não?

    - Abri uma conexão e em seguida uma Transaction

    - Fiz o primeiro lançamento.

    - Fiz o segundo lançamento.

    - Faço uma consulta de saldo(Consulta futura, incluindo os lançamentos na transaction)

    - Faço o lançamento da tarifa dependendo da consulta de saldo.

    segunda-feira, 17 de outubro de 2016 17:46

Respostas

  • Cesar, para fazer uma leitura suja (considerar registros alterados numa transação) você deve alterar a propriedade Transaction.IsolationLevel para ReadUncommitted.

    Documentação sobre transações no ADO.Net na MSDN: https://msdn.microsoft.com/en-us/library/ms971557.aspx


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer". Se achou este post útil, por favor clique em "Votar como útil". Se por um acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    segunda-feira, 17 de outubro de 2016 17:59

Todas as Respostas

  • Cesar, para fazer uma leitura suja (considerar registros alterados numa transação) você deve alterar a propriedade Transaction.IsolationLevel para ReadUncommitted.

    Documentação sobre transações no ADO.Net na MSDN: https://msdn.microsoft.com/en-us/library/ms971557.aspx


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer". Se achou este post útil, por favor clique em "Votar como útil". Se por um acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    segunda-feira, 17 de outubro de 2016 17:59
  • Mais uma dúvida Juliano, neste caso vou ler o que está no banco e dentro da transaction certo? se houver uma outra transaction em paralelo, ela não vai incluir a "sujeira" da primeira transaction ou estou enganado?
    segunda-feira, 17 de outubro de 2016 18:26
  • Se estas utilizarem a mesma conexão com o banco, sim, irá incluir a "sujeira" da primeira transação.

    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer". Se achou este post útil, por favor clique em "Votar como útil". Se por um acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    segunda-feira, 17 de outubro de 2016 18:55
  • Ok, obrigado!
    segunda-feira, 17 de outubro de 2016 19:04
  • Só para informar, mesmo sendo duas conexões diferentes e cada uma abrindo uma nova transaction, se ambas conexões tiverem aberta, elas vão pegar a sujeira.        


    static void Main(string[] args)
            {
                string connectionString = "Server=REND-SRVDSQL-01;Database=IK_VAREJO;User Id=CelulaSustentacao;Password=CelulaSustentacao;";

                decimal resultado2 = 0.0M;
                decimal resultado3 = 0.0M;

                SqlConnection con1 = null;
                SqlConnection con2 = null;
                SqlConnection con3 = null;

                SqlTransaction transaction1 = null;
                SqlTransaction transaction2 = null;
                SqlTransaction transaction3 = null;

                try
                {
                    con1 = new SqlConnection(connectionString);
                    con1.Open();
                    transaction1 = con1.BeginTransaction();

                    var com1 = con1.CreateCommand();
                    com1.Transaction = transaction1;
                    com1.CommandText = "DELETE FROM TBL_TESTE_CESAR";
                    com1.CommandType = System.Data.CommandType.Text;
                    com1.ExecuteNonQuery();
                    com1.Dispose();

                    var com2 = con1.CreateCommand();
                    com2.Transaction = transaction1;
                    com2.CommandText = "INSERT INTO TBL_TESTE_CESAR VALUES(1000.0)";
                    com2.CommandType = System.Data.CommandType.Text;
                    com2.ExecuteNonQuery();
                    com2.Dispose();

                    transaction1.Commit();

                    con2 = new SqlConnection(connectionString);
                    con2.Open();
                    transaction2 = con2.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted);

                    var com4 = con2.CreateCommand();
                    com4.Transaction = transaction2;
                    com4.CommandText = "INSERT INTO TBL_TESTE_CESAR VALUES(1000.0)";
                    com4.CommandType = System.Data.CommandType.Text;
                    com4.ExecuteNonQuery();
                    com4.Dispose();

                    var com5 = con2.CreateCommand();
                    com5.Transaction = transaction2;
                    com5.CommandText = "INSERT INTO TBL_TESTE_CESAR VALUES(1000.0)";
                    com5.CommandType = System.Data.CommandType.Text;
                    com5.ExecuteNonQuery();
                    com5.Dispose();

                    var com6 = con2.CreateCommand();
                    com6.Transaction = transaction2;
                    com6.CommandText = "SELECT SUM(VALOR) AS VALOR FROM TBL_TESTE_CESAR";
                    com6.CommandType = System.Data.CommandType.Text;
                    var dr1 = com6.ExecuteReader();
                    if (dr1.HasRows)
                    {
                        dr1.Read();
                        resultado2 = Convert.ToDecimal(dr1["VALOR"]);
                        dr1.Close();
                    }
                    com6.Dispose();


                    con3 = new SqlConnection(connectionString);
                    con3.Open();
                    transaction3 = con3.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted);

                    var com7 = con3.CreateCommand();
                    com7.Transaction = transaction3;
                    com7.CommandText = "INSERT INTO TBL_TESTE_CESAR VALUES(1000.0)";
                    com7.CommandType = System.Data.CommandType.Text;
                    com7.ExecuteNonQuery();
                    com7.Dispose();

                    var com8 = con3.CreateCommand();
                    com8.Transaction = transaction3;
                    com8.CommandText = "SELECT SUM(VALOR) AS VALOR FROM TBL_TESTE_CESAR";
                    com8.CommandType = System.Data.CommandType.Text;
                    var dr2 = com6.ExecuteReader();
                    if (dr2.HasRows)
                    {
                        dr2.Read();
                        resultado3 = Convert.ToDecimal(dr2["VALOR"]);
                        dr2.Close();
                    }
                    com6.Dispose();

                    transaction3.Commit();
                    transaction2.Commit();

                    Console.WriteLine(string.Format("Resultado 2: {0}", resultado2));
                    Console.WriteLine(string.Format("Resultado 3: {0}", resultado3));


                }
                catch (Exception ex)
                {
                    if (transaction1 != null)
                    {
                        transaction1.Rollback();
                    }

                    if (transaction2 != null)
                    {
                         transaction3.Rollback();
                    }

                    if (transaction3 != null)
                    {
                        transaction3.Rollback();
                    }
                }
                finally 
                {
                    if (con1 != null) 
                    {
                        con1.Close();
                        con1.Dispose();
                    }

                    if (con2 != null)
                    {
                        con2.Close();
                        con2.Dispose();
                    }

                    if (con3 != null)
                    {
                        con3.Close();
                        con3.Dispose();
                    }
                }




                Console.ReadKey();
            }

                                                    
    terça-feira, 18 de outubro de 2016 13:46