Gentili,
sto tentanto di applicare il lock pessimistico durante l'aggiornamento di una riga in Ms Access.
Premesso che ho trovato tutti esempi per SqlServer e relativo namespace, etc ho provato ad implementare una routine usando i relativi oggetti oledb:
public void UseTransactions()
{
bool accessoVietato = false;
using (OleDbConnection connDb = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Luciano\Desktop\dbProva.accdb"))
{
connDb.Open();
do
{
//OleDbTransaction transaction = connDb.BeginTransaction(System.Data.IsolationLevel.Serializable); // RITORNA ERRORE
OleDbTransaction transaction = connDb.BeginTransaction(System.Data.IsolationLevel.RepeatableRead); // RITORNA ERRORE
// leggo dalla tabella contatori il campo num_ultimo_ordine
contatoriCmd = new OleDbCommand(...., connDb, transaction);
// aggiorno nella tabella contatori il campo num_ultimo_ordine (qui dovrebbe bloccare l'aggiornamento il lock)
updateCmd = new OleDbCommand(...., connDb, transaction);
// inserisco nella tabella testate_ordini il nuovo ordine con Id = num_ultimo_ordine;
insertCmd = new OleDbCommand(...., connDb, transaction);
try
{
contatoriCmd.ExecuteQuery();
updateCmd.ExecuteNonQuery();
insertCmd.ExecuteNonQuery();
transaction.Commit();
accessoVietato = false;
}
catch (Exception ex)
{
transaction.Rollback();
Console.WriteLine(ex.Message);
System.Threading.Thread.Sleep(1000);
accessoVietato = true;
}
} while (accessoVietato);
}
}
}
L'esempio non è del tutto corretto e coerente, ma in pratica nella realtà voglio effettuare una transazione con più comandi sql, se non vanno a buon termine faccio il rollback e ritento ancora, applicando il locking pessimistico. Purtroppo nella riga dove definisco il tipo di IsolationLevel a Serializable o RepeatableRead mi ritorna un errore
Messaggio=Impossibile supportare il livello di isolamento specificato o il suo potenziamento.
Se io imposto IsolationLevel con gli altri valori previsti dall'enum non mi dà errore, ma non so a questo punto se il lock pessimistico viene rispettato oppure no.
A voi è capitata una situazione del genere? E' un limite di Oledb?
Eventualmente potrei gestire con un lock ottimistico usando un DataSet?
Grazie in anticipo a chiunque vorrà rispondermi.
Lucius.