Domanda

So che la stessa valore per una colonna RowVersion non è di per sé utile, tranne che cambia ogni volta la riga viene aggiornata. Tuttavia, mi chiedevo se sono utili per il parente (diseguaglianza) confronto.

Se ho una tabella con una colonna RowVersion, sono una delle seguenti condizioni:

  • saranno tutti gli aggiornamenti che si verificano simultaneamente (sia stessa istruzione di aggiornamento o stessa transazione) hanno lo stesso valore nella colonna RowVersion?
  • Se faccio aggiornamento "A", seguito da update "B", sarà le righe coinvolte in aggiornamento "B" hanno un valore superiore a quello delle righe coinvolte in aggiornamento "A"?

Grazie.

È stato utile?

Soluzione

Da MSDN :

Ogni database ha un contatore che è incrementato per ciascun inserimento o aggiornamento operazione che viene eseguita su una tabella che contiene una colonna rowversion all'interno del database. Questo contatore è l'rowversion database. Questa traccia un tempo relativo all'interno di un database, non un tempo effettivo che può essere associato con un orologio. Ogni volta che una riga con una colonna rowversion viene modificato o inserito , il incrementato efficienti rowversion valore è inserita nella colonna rowversion.

http://msdn.microsoft.com/en-us/library/ ms182776.aspx

  • Per quanto ho capito, non succede nulla EFFETTIVAMENTE contemporaneamente nel sistema. Ciò significa che tutti i rowversions deve essere univoco. Mi permetto di dire che sarebbero effettivamente inutile se i duplicati sono stati ammessi all'interno della stessa tabella. dando anche credance a rowversions non essere duplicato è la posizione di MSDN di non utilizzare loro come chiavi primarie non perché causerebbe violazioni, ma perché sarebbe causare problemi chiave esterna.
  • Secondo MSDN, "Il tipo di dati rowversion è solo un numero incrementale ..." Quindi sì, poi è più grande.

Per la questione del Quanto incrementa, MSDN afferma: "[rowversion] tracce di un tempo relativo all'interno di un database", che indica che non è un numero intero fluido incrementale, ma il tempo basano. Tuttavia, questo "tempo" rivela nulla di quando esattamente , bensì quando in relazione ad altre righe una riga è stata inserita / modificato.

Altri suggerimenti

Alcune informazioni aggiuntive. convertiti rowversion ben al bigint e quindi si può visualizzare uscita meglio leggibile quando il debug:

CREATE TABLE [dbo].[T1](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Value] [nvarchar](50) NULL,
    [RowVer] [timestamp] NOT NULL
) 

insert into t1 ([value]) values ('a')
insert into t1 ([value]) values ('b')
insert into t1 ([value]) values ('c')
select Id, Value,CONVERT(bigint,rowver)as RowVer from t1
update t1 set [value] = 'x' where id = 3
select Id, Value,CONVERT(bigint,rowver)as RowVer from t1
update t1 set [value] = 'y' 
select Id, Value,CONVERT(bigint,rowver)as RowVer from t1

Id  Value   RowVer
1   a   2037
2   b   2038
3   c   2039

Id  Value   RowVer
1   a   2037
2   b   2038
3   x   2040

Id  Value   RowVer
1   y   2041
2   y   2042
3   y   2043

ho trascorso età cercando di risolvere qualcosa con questo - a chiedere per le colonne aggiornati dopo un determinato numero di sequenza. Il timestamp è in realtà solo un numero di sequenza -. È anche bigEndian quando c # funzioni come BitConverter.ToInt64 vogliono littleEndian

Ho finito per creare una vista db sul tavolo voglio i dati da una colonna con alias 'SequenceNo'

SELECT     ID, CONVERT(bigint, Timestamp) AS SequenceNo
FROM         dbo.[User]

c # Codice vede prima la vista (cioè userv) identico a un tavolo normale

poi nella mia LINQ posso aderire al tavolo con vista e genitore e confrontare con un numero di sequenza

var users =  (from u in context.GetTable<User>()
                join uv in context.GetTable<UserV>() on u.ID equals uv.ID
                where mysequenceNo < uv.SequenceNo
                orderby uv.SequenceNo
                select u).ToList();

per ottenere ciò che voglio -. Tutte le voci modificati dopo l'ultima volta che ho controllato

Cosa ti fa pensare che i tipi di dati di data e ora sono il male? Il tipo di dati è molto utile per la verifica di concorrenza. LINQ to SQL utilizza questo tipo di dati per questo scopo.

Le risposte alle tue domande:

1) No. Questo valore viene aggiornato ogni volta che la riga viene aggiornata. Se si sta aggiornando il dire fila per cinque volte, ogni aggiornamento incrementerà il valore di timestamp. Naturalmente, ci si rende conto che gli aggiornamenti che "si verificano contemporaneamente" in realtà non lo fanno. Hanno ancora si verificano solo una alla volta, a sua volta.

2) Sì.

Proprio come una nota, timestamp è deprecato in SQL Server 2008 in poi. rowversion dovrebbe essere usato al posto.

questa pagina su MSDN :

Il timestamp la sintassi è deprecato. Questa caratteristica verrà rimossa in un prossime versioni di Microsoft SQL Server. Evitare di utilizzare questa funzionalità in nuovo progetto di sviluppo e prevedere interventi di modifica delle applicazioni che utilizzare questa funzione.

rowversion si rompe uno dei "idealistica" approcci di SQL - che un'istruzione UPDATE è una singola azione atomica, e agisce come se tutti gli aggiornamenti (sia a tutte le colonne all'interno di una riga e tutte le righe all'interno della tabella) si verificano "allo stesso tempo". Ma in questo caso, con rowversion, è possibile determinare che una riga è stata aggiornata in un tempo leggermente differente rispetto ad un altro.

Si noti che l'ordine in cui vengono aggiornate le righe (da una singola istruzione di aggiornamento) non è garantita - può, per coincidenza seguire lo stesso ordine della chiave cluster per la tavola, ma non vorrei contare su di che essere vera .

Per rispondere a parte della tua domanda: si può finire con i valori duplicati in base a MSDN:

I valori rowversion duplicati possono essere generati utilizzando il SELECT INTO dichiarazione in cui una colonna rowversion è nella lista SELECT. Noi facciamo Non consiglia di utilizzare rowversion in questo modo.

Fonte: rowversion (Transact-SQL)

Ogni database ha un contatore che viene incrementato ad uno ad uno su ogni modifica dei dati che viene fatto nel database. Se la tabella contenente la riga interessata (da update / insert) contiene una colonna timestamp / rowversion, il valore corrente del contatore del database viene memorizzato in quella colonna del record aggiornato / inserito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top