Fórum EDM x Transação #3489

11/03/2009

0

Ola pessoal, estamos implementando uma transação em uma aplicação que estamos desenvolvendo. Fiz um código de exemplo para verificar se funcionaria como descrito abaixo:     Porém o que acontece, quando executo o codigo do page_load a tabela fica travada se faço um select na tabela que estou inserindo um registro ele fica travada até que eu execute um commit ou um rollback. O que posso fazer para resolver esse problema??   Aguardo uma resposta o mais breve possível.   Atenciosamente,   Julio Nefrodata Sistemas
Nefrodata Ltda

Nefrodata Ltda

Responder

Posts

11/03/2009

Fabio Mans

Segue um exemplo abaixo, pelo que vi você está fazendo no botão, tem que ser após incluir.   Esperto ter ajudado   Fabio     System.Data.Common.DbTransaction trans = null;
DataClassesDataContext objDataClass = new DataClassesDataContext
                 (ConfigurationManager.ConnectionStrings
                                       [Constants.ConnectionString].ConnectionString);
try
{                 // Nullable data type as the methods generated for SP will use Nullable
                // type
                int? intCategoryID =0;
                int? intProductID =0;                 // Open the connection
                objDataClass.Connection.Open();                 // Begin the transaction
                trans = objDataClass.Connection.BeginTransaction();
               
                // Assign transaction to context class
                // All the database operation perform by this object will now use
                //transaction 
                objDataClass.Transaction = trans;                 // Insert Category
                // I have to use Ref keyword CategoryID of newly added category will
                // be assign to this variable
                objDataClass.InsertCategory
                                          (
                                            ref intCategoryID, 
                                            txtName.Text.Trim().Replace(“‘”, “””), 
                                            txtDescription.Text.Trim().Replace(“‘”, “””),
                                            new byte[0]
                                          );
                                                // Insert Product
                // I have to use Ref keyword as ProductID of newly generated product will
                // be assign to this variable
                objDataClass.InsertProduct
                                          (
                                            ref intProductID,
                                            txtProductName.Text.Trim().Replace(“‘”,“””),
                                            null,
                                            intCategoryID,
                                            txtQuantityPerUnit.Text.Trim().Replace(“‘”, “””),
                                            Convert.ToDecimal(
                                                      txtUnitPrice.Text.Trim().Replace(“‘”, “””)
                                                                                  ),
                                             null,
                                             null,
                                             null,
                                             0);
                                // Commit transaction
                trans.Commit();                
            }
            catch (Exception ex)
            {                                     // Rollback transaction
                    if (trans != null)
                                 trans.Rollback();
            }
            finally
            {                       // Close the connection
                      if (objDataClass.Connection.State == ConnectionState.Open)
                                 objDataClass.Connection.Close();
            }
Responder

Gostei + 0

11/03/2009

Nefrodata Ltda

Fábio a questão é a seguinte eu preciso abrir uma transação ao abrir a página e só quero executar um commit ou um rollback após clicar em um dos botões, por isso eu abro uma conexão no pageload e armazeno ela numa Session e somente depois eu executo o commit ou rollback o exemplo que passei era só para saber se isso funcionaria, e funciona. A questão é o isolamento, quando eu abro uma transação e faço uma inclusão numa tabela ele bloqueia toda minha tabela não consigo ler ela enquanto não executo um commit ou um rollback.   Tem como eu não bloquear minha tabela??   Julio Nefrodata Sistemas
Responder

Gostei + 0

11/03/2009

Fabio Mans

Tenta mudar o Enumeração IsolationLevel   http://msdn.microsoft.com/pt-br/library/system.data.isolationlevel.aspx   Veja se em algum dele é possível fazer a leitura.     Fabio  
Responder

Gostei + 0

11/03/2009

Nefrodata Ltda

Tentei todos os níveis de isolamento e todos eles bloqueiam a tabela toda, eu precisava demais que isso funcionasse.    
Responder

Gostei + 0

11/03/2009

Fabio Mans

Muda a lógica, você concorda que é fora do comum o que esta fazendo?
Responder

Gostei + 0

11/03/2009

Nefrodata Ltda

Vou verificar o que podemos fazer aqui, mas gostaria de entender porque a tabela esta sendo bloqueada?? Estou usando o nivel de isolamento ReadCommited que não bloqueia nem o registro em outros casos.   Obrigado   Júlio
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar