EDM x Transação
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
Curtidas 0
Respostas
Fabio Mans
11/03/2009
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();
}
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();
}
GOSTEI 0
Nefrodata Ltda
11/03/2009
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
GOSTEI 0
Fabio Mans
11/03/2009
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
GOSTEI 0
Nefrodata Ltda
11/03/2009
Tentei todos os níveis de isolamento e todos eles bloqueiam a tabela toda, eu precisava demais que isso funcionasse.
GOSTEI 0
Fabio Mans
11/03/2009
Muda a lógica, você concorda que é fora do comum o que esta fazendo?
GOSTEI 0
Nefrodata Ltda
11/03/2009
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
GOSTEI 0