none
Leggere Record bloccato da altra transazione RRS feed

  • Domanda

  • Salve a tutti,


    Supponiamo che ci sia una transazione(ADO.net) che vada in aggiornamento su un campo di un record esempio


     

          string sql = " update TB1 Set CampoTest='TRANSAC' where ID='c0b6c451-ffa3-471e-b5ea-e8bbc25afbf8' ";
          CMDTrans = new SqlCommand(sql, DBHelper.GetConnection());
          CMDTrans.Connection.Open();
          CMDTrans.Transaction = CMDTrans.Connection.BeginTransaction();
          CMDTrans.ExecuteNonQuery();
    


    supponiamo che prima di fare commit o rollback si perda ancora qualche secondo.

    E' possibile fare in modo che un altro programma accedendo a quel record

     

          string sql = " Select CampoTest From TB1 where ID='c0b6c451-ffa3-471e-b5ea-e8bbc25afbf8' ";
          SqlCommand CMD = new SqlCommand(sql, DBHelper.GetConnection());
          CMD.Connection.Open();
          string S = (string)CMD.ExecuteScalar();
    


    non resti in attesa del completamento della treansazione ma mi restituisca l'ultimo valore committato?

    Ciao e grazie

    • Tipo modificato G Luca giovedì 27 gennaio 2011 14:52
    • Spostato Mila Daniel Ovidiu martedì 1 febbraio 2011 12:30 transazioni (Da:Microsoft Visual C# Forum)
    giovedì 27 gennaio 2011 14:51

Risposte

  • non resti in attesa del completamento della treansazione ma mi restituisca l'ultimo valore committato?

    Per restituire l'ultimo valore committato devi abilitare lo Snapshot Isolation Level oppure impostare l'opzione READ_COMMITTED_SNAPSHOT per il database.

    Leggi MOLTO ATTENTAMENTE questo paragrafo dei Books Online per capire come funziona il row versioning e quali sono i pro ed i contro di una tale configurazione.

    Ciao!


    Lorenzo Benaglia
    Microsoft MVP - SQL Server
    http://blogs.dotnethell.it/lorenzo
    http://social.microsoft.com/Forums/it-IT/sqlserverit
    • Contrassegnato come risposta G Luca mercoledì 2 febbraio 2011 10:00
    martedì 1 febbraio 2011 21:44
    Moderatore
  • salve,

    come sempre, Mauro "ricorda bene"...  ti segnalo il livello di isolamento snapshot, che puo' risolvere la tua problematica.. questo pero' non vuol dire che ne "apra" altre, sempre di problematica... il tuo tempdb diventera' un vero e proprio collo di bottiglia ed il version store potrebbe causare rallentamenti o performance degradate nel caso di catene molto lunghe.. dici anche, "... supponiamo che prima di fare commit o rollback si perda ancora qualche secondo ..." , e ovviamente la "lunghezza" delle transazioni anche in termini temporali ha un "costo" che puo' o non puo' essere accettabile.. questa funzionalita' e' stata introdotta "proprio" per "risolvere" scenari piu' o meno simili a quanto da te indicato, ma ricorda che, come sempre, "it depends" ed anche che "tutto ha un costo".., quindi predisponi load test adeguati e rispecchianti la tua "realta'" prima di causare danni :)

    saluti


    http://www.asql.biz - DbaMgr2k - DbaMgr and further SQL Tools http://www.hotelsole.com/ - http://www.hotelsolericcione.de
    • Contrassegnato come risposta G Luca mercoledì 2 febbraio 2011 10:00
    martedì 1 febbraio 2011 22:50
    Moderatore

Tutte le risposte

  • Ciao G Luca,

    You wrote on 27/01/2011 :

    non resti in attesa del completamento della treansazione ma mi restituisca l'ultimo valore committato?

    dipende dal livello di isolamento della transazione se non ricordo male.

    .m


    Mauro Servienti
    {C67C0157-5D98-4733-A75E-93CAEE4BADC8}
    Microsoft MVP - Visual C# / MCTS
    http://mvp.support.microsoft.com
    blog @ http://milestone.topics.it
    whynot [ at ] topics [ dot ] it
    giovedì 27 gennaio 2011 17:45
  • dipende dal livello di isolamento della transazione se non ricordo male.

    .m


    Mauro Servienti
    {C67C0157-5D98-4733-A75E-93CAEE4BADC8}
    Microsoft MVP - Visual C# / MCTS
    http://mvp.support.microsoft.com
    blog @ http://milestone.topics.it
    whynot [ at ] topics [ dot ] it

     

    Ciao,

    Ho provato tutte le combinazioni di IsolationLevel, prima di tutto sulla transazione che rimane aperta:

    string sql = " update TB1 Set CampoTest='TRANSAC' where ID='c0b6c451-ffa3-471e-b5ea-e8bbc25afbf8' ";
      CMDTrans = new SqlCommand(sql, DBHelper.GetConnection());
      CMDTrans.Connection.Open();
      CMDTrans.Transaction = CMDTrans.Connection.BeginTransaction(IsolationLevel.[Tutti quelli supportati da Sql 2005]);
      CMDTrans.ExecuteNonQuery();
    


    Ma con nessuno la query di lettura mi restituisce l'ultimo valore committato ma rimane sempre in attesa.

    Ho anche provato ad aggiungere una transazione in lettura :

               

    string sql = " Select CampoTest From TB1 where ID='c0b6c451-ffa3-471e-b5ea-e8bbc25afbf8' ";
       SqlCommand CMD = new SqlCommand(sql, DBHelper.GetConnection());
       CMD.Connection.Open();
       CMD.Transaction = CMD.Connection.BeginTransaction(IsolationLevel.[Tutti quelli supportati da Sql 2005]);   
    string S = (string)CMD.ExecuteScalar();
    


    facendo poi tutte le combinazioni di isolation laevel tra la transazione che aggiorna e quella che legge, ma l'unico risultato che sono riuscito ad ottenere è stato di leggere il valore pending e non ancora committato dalla transazione di aggiornamento con IsolationLevel.ReadUncommitted sulla transazione di lettura.

    Qualeche idea?

     

    venerdì 28 gennaio 2011 09:31
  • non resti in attesa del completamento della treansazione ma mi restituisca l'ultimo valore committato?

    Per restituire l'ultimo valore committato devi abilitare lo Snapshot Isolation Level oppure impostare l'opzione READ_COMMITTED_SNAPSHOT per il database.

    Leggi MOLTO ATTENTAMENTE questo paragrafo dei Books Online per capire come funziona il row versioning e quali sono i pro ed i contro di una tale configurazione.

    Ciao!


    Lorenzo Benaglia
    Microsoft MVP - SQL Server
    http://blogs.dotnethell.it/lorenzo
    http://social.microsoft.com/Forums/it-IT/sqlserverit
    • Contrassegnato come risposta G Luca mercoledì 2 febbraio 2011 10:00
    martedì 1 febbraio 2011 21:44
    Moderatore
  • salve,

    come sempre, Mauro "ricorda bene"...  ti segnalo il livello di isolamento snapshot, che puo' risolvere la tua problematica.. questo pero' non vuol dire che ne "apra" altre, sempre di problematica... il tuo tempdb diventera' un vero e proprio collo di bottiglia ed il version store potrebbe causare rallentamenti o performance degradate nel caso di catene molto lunghe.. dici anche, "... supponiamo che prima di fare commit o rollback si perda ancora qualche secondo ..." , e ovviamente la "lunghezza" delle transazioni anche in termini temporali ha un "costo" che puo' o non puo' essere accettabile.. questa funzionalita' e' stata introdotta "proprio" per "risolvere" scenari piu' o meno simili a quanto da te indicato, ma ricorda che, come sempre, "it depends" ed anche che "tutto ha un costo".., quindi predisponi load test adeguati e rispecchianti la tua "realta'" prima di causare danni :)

    saluti


    http://www.asql.biz - DbaMgr2k - DbaMgr and further SQL Tools http://www.hotelsole.com/ - http://www.hotelsolericcione.de
    • Contrassegnato come risposta G Luca mercoledì 2 febbraio 2011 10:00
    martedì 1 febbraio 2011 22:50
    Moderatore
  • non resti in attesa del completamento della treansazione ma mi restituisca l'ultimo valore committato?

    Per restituire l'ultimo valore committato devi abilitare lo Snapshot Isolation Level oppure impostare l'opzione READ_COMMITTED_SNAPSHOT per il database.

    Leggi MOLTO ATTENTAMENTE questo paragrafo dei Books Online per capire come funziona il row versioning e quali sono i pro ed i contro di una tale configurazione.

    Ciao!


    Lorenzo Benaglia
    Microsoft MVP - SQL Server
    http://blogs.dotnethell.it/lorenzo
    http://social.microsoft.com/Forums/it-IT/sqlserverit
    ciao,
    Grazie per il prezioso riferimento.

    Il database in questione è in questa situazione :

    Frequenti letture che devono essere esaudite nel più breve tempo possibile
    Rari update


    in questa situazione READ_COMMITTED_SNAPSHOT dovrebbe essere la suluzione.


    Provo a procedere in questa direzione

    Grazie ancora

    mercoledì 2 febbraio 2011 09:58
  • Ciao G Luca,

    You wrote on 28/01/2011 :

    facendo poi tutte le combinazioni di isolation laevel tra la transazione che aggiorna e quella che legge, ma l'unico risultato che sono riuscito ad ottenere è stato di leggere il valore pending e non ancora committato dalla transazione di aggiornamento con IsolationLevel.ReadUncommitted sulla transazione di lettura.

    Qualeche idea?

    purtroppo no.

    .m


    Mauro Servienti
    {C67C0157-5D98-4733-A75E-93CAEE4BADC8}
    Microsoft MVP - Visual C# / MCTS
    http://mvp.support.microsoft.com
    blog @ http://milestone.topics.it
    whynot [ at ] topics [ dot ] it
    venerdì 4 febbraio 2011 07:06