40 messaggi dal 23 ottobre 2013
Ciao a tutti, vi spiego il problema:

L'applicativo per gli utenti usa dati criptati memorizzati nella tabella user_encrypted. Ogni volta che si accede a una company e si fa accesso ai dati criptati viene chiamata una store procedure che decripta i dati e li salva in chiaro nella tabella user, quando ha finito di usarli fa encriptazione, che li cancella dalla tabella user e li rimette in user_encrypted.

Il problema e quando due utenti della stessa company accedono nello stesso momento ai dati, a seconda dell'ordine di come vengono eseguite le rispettive store procedure, si verifica perdita o duplicazione dati.

Avrei bisogno di un semaforo per accesso esclusivo al processo di decrypt-encrypt. Qualche idea?

Io ho provato cosi, ho definito delle variabli di applicazione, con lock-unlock in lettura-scrittura, quando uno decripta legge variabile per quella company, se false va avanti, se true aspetta finche la variabile e false.

Per fare in modo di aspettare ho messo un while true, che esce cmq dopo 3 secondi oppure quando la variabile e zero.

Il problema pero e che se un client e nel ciclo while che si ripete rallenta l'intera applicazione. Qualche suggerimento a riguardo per migliorare questo tipo di soluzione, oppure nel caso una soluzione piu opportuna?

Grazie per l'aiuto.

PS: per completezza posto le due funzioni di lock-unlock richiamate prima, e dopo per unlock, di chiamare le store procedure


protected void LockHREncryptedData(string partnerCode)
{
bool setted = false;
bool locked = false;
string applicationVariableName = "";

try
{
using (MLDbConnection dbConn = MLDatabase.OpenConnection())
{
applicationVariableName = string.Format("HR_ENCRYPTED_LOCKER_{0}", partnerCode);

string HRLockEnabled = new MLSettings().GetValue("World", "HRLockEnabled", dbConn, null);
if (HRLockEnabled == "0")
{
HttpContext.Current.Application[applicationVariableName] = false;
return;
}

if (string.IsNullOrEmpty(partnerCode))
return;

DateTime time1 = DateTime.UtcNow;

while (true)
{
Application.Lock();
locked = true;

bool state = Convert.ToBoolean(HttpContext.Current.Application[applicationVariableName]);

if (!state)
{
HttpContext.Current.Application[applicationVariableName] = true;
setted = true;

break;
}

DateTime time2 = DateTime.UtcNow;

if (state)
{
if ((time2 - time1).TotalMilliseconds> 3000)
{
HttpContext.Current.Application[applicationVariableName] = true;
setted = true;

break;
}
}

Application.UnLock();
locked = false;

if (!setted)
System.Threading.Thread.Sleep(150);
}
}
}
catch (Exception)
{
if (setted)
HttpContext.Current.Application[applicationVariableName] = false;
}
finally
{
if (locked)
Application.UnLock();
}
}





protected void UnLockHREncryptedData(string partnerCode)
{
string applicationVariableName = "";
bool locked = false;

try
{
using (MLDbConnection dbConn = MLDatabase.OpenConnection())
{
applicationVariableName = string.Format("HR_ENCRYPTED_LOCKER_{0}", partnerCode);

string HRLockEnabled = new MLSettings().GetValue("World", "HRLockEnabled", dbConn, null);
if (HRLockEnabled == "0")
{
HttpContext.Current.Application[applicationVariableName] = false;
return;
}

if (string.IsNullOrEmpty(partnerCode))
return;

Application.Lock();
locked = true;

bool state = Convert.ToBoolean(HttpContext.Current.Application[applicationVariableName]);

if (state)
{
HttpContext.Current.Application[applicationVariableName] = false;
}

}
}
catch (Exception ex)
{
HttpContext.Current.Application[applicationVariableName] = false;
}
finally
{
if (locked)
Application.UnLock();
}
}
11 messaggi dal 12 febbraio 2011
Il Valore bloccata non bloccata lo leggi in una tabella e magari la tabella Utenti criptata la spezzi in varie tabelle magari in base alla seconda lettera del NomeUtente
quindi chi vuole aprire la tabella x per decriptarla legge prima l'icsesimo record della tabella Tbl_Bloccate se il valore del campo Bloccata à false lo imposta su true e decripta a fine lavoro lo imposta su false.
A questo punto per perfezionare il tutto il semaforo lo metti sul controllo di Tbl_Bloccate

questo è esempio
Buona giornata

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.