Pregunta

Sé que el propio valor para una columna RowVersion no es de por sí útil, excepto que cambia cada vez que se actualiza la fila. Sin embargo, me preguntaba si son útiles para la comparación relativa (desigualdad).

Si tengo una tabla con una columna RowVersion, son una de las siguientes cierto:

  • ¿Todas las actualizaciones que se producen al mismo tiempo (ya sea igual o instrucción de actualización misma transacción) tienen el mismo valor en la columna de la RowVersion?
  • Si hago actualización "A", seguido de actualización "B", se las filas involucradas en la actualización de "B" tienen un valor más alto que las filas involucradas en la actualización de "A"?

Gracias.

¿Fue útil?

Solución

De MSDN :

Cada base de datos tiene un contador que es incrementa para cada inserción o actualización operación que se realiza en una tabla que contiene una columna rowversion dentro de la base de datos. Este contador es el rowversion base de datos. Este seguimiento de un tiempo relativo dentro de una base de datos, no un tiempo real que puede estar asociada con un reloj. Cada vez que una fila con una columna rowversion , la incrementa rowversion base de datos valor es modificado o insertado se inserta en la columna de la rowversion.

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

  • Por lo que yo entiendo, no hay nada que realmente ocurre simultáneamente en el sistema. Esto significa que todos los rowversions deben ser únicos. Me atrevo a decir que serían inútiles si efectivamente duplicados fueron permitidos dentro de la misma mesa. También da a credance rowversions no se está duplicando la postura de MSDN en no utilizarlos como claves primarias no porque causarían violaciónes, pero porque causaría problemas clave externa.
  • Según MSDN, "El tipo de datos rowversion es sólo un número incremental ..." así que sí, después es más grande.

A la pregunta de ¿Cuánto ¿Es incrementos, estados de MSDN, "[rowversion] Pistas en un tiempo relativo dentro de una base de datos", que indica que no es un número entero de líquido incrementando, pero el tiempo basan. Sin embargo, este "tiempo" no revela nada de cuando exactamente , sino más bien cuando en relación con otras filas se inserta una fila / modificada.

Otros consejos

Algunas informaciones adicionales. conversos rowversion bien a Bigint y así uno puede visualizar la salida mejor legible al depurar:

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

Me pasó las edades tratando de ordenar algo con esto - para pedir columnas actualizados después de un número de secuencia en particular. La marca de tiempo es realmente sólo un número de secuencia -. BigEndian también cuando C # funciona como BitConverter.ToInt64 quieren littleEndian

terminé creando una vista db en la mesa quiero los datos de con una columna de alias 'SequenceNo'

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

c # Código primera ve la vista (es decir userv) de forma idéntica a una tabla normal

A continuación, en mi LINQ que puede unirse a la vista y la tabla padre y comparar con un número de secuencia

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();

para conseguir lo que quiero -. Todas las entradas cambiado desde la última vez que lo comprobé

¿Qué le hace pensar que los tipos de datos de marca de hora son malos? El tipo de datos es muy útil para la comprobación de la concurrencia. LINQ a SQL utiliza este tipo de datos para este mismo propósito.

Las respuestas a sus preguntas:

1) No. Este valor se actualiza cada vez que se actualiza la fila. Si va a actualizar la fila digamos cinco veces, cada actualización se incrementará el valor de marca de hora. Por supuesto, se da cuenta que las actualizaciones que "se producen simultáneamente" en realidad no lo hacen. Todavía se producen sólo uno a la vez, a su vez.

2) Sí.

Así como una nota, timestamp está en desuso en SQL Server 2008 en adelante. rowversion se debe utilizar en su lugar.

esta página en MSDN :

La timestamp sintaxis está en desuso. Esta característica se quitará en una versión futura de Microsoft SQL Server. Evitar el uso de esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente utilizar esta función.

rowversion hace una pausa de la "idealista" acerca de SQL - que una instrucción UPDATE es una sola acción, atómico, y actúa como si todas las actualizaciones (tanto a todas las columnas de una fila, y todas las filas en la tabla) se producen "al mismo tiempo". Pero en este caso, con rowversion, es posible determinar que una fila se actualizó a la vez un poco diferente que el otro.

Tenga en cuenta que el orden en el que se actualizan las filas (por una sola instrucción de actualización) no está garantizada - puede, por coincidencia seguir el mismo orden que la clave agrupada para la mesa, pero no contaría con que el ser cierto .

Para responder a parte de su pregunta: se puede terminar con valores duplicados de acuerdo con MSDN:

valores rowversion duplicados se puede generar mediante el uso de la SELECT INTO declaración en la que una columna rowversion está en la lista SELECT. Hacemos No recomendamos el uso de rowversion de esta manera.

Fuente: rowversion (Transact-SQL)

Cada base de datos tiene un contador que se incrementa de uno en uno en cada modificación de datos que se realiza en la base de datos. Si la tabla que contiene la fila afectada (por actualización / inserto) contiene una columna de marca de hora / rowversion, el valor actual del contador de la base de datos se almacena en esa columna del registro actualizado / insertado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top