Utilizar Concurrencia Optimista

March 18, 2018 | Author: Andres Fernandez | Category: Table (Database), Databases, Information Technology Management, Areas Of Computer Science, Software


Comments



Description

Utilizar concurrencia optimista.NET Framework 2.0 Otras versiones Personas que lo han encontrado útil: 4 de 4 - Valorar este tema En un entorno multiusuario existen dos modelos para actualizar datos en una base de datos: concurrencia optimista y concurrencia pesimista. El objeto DataSet está diseñado para fomentar el uso de la concurrencia optimista en actividades cuya ejecución tiene una larga duración, como cuando se trabaja con interacción remota y cuando los usuarios interactúan con datos. La concurrencia pesimista implica bloquear filas en el origen de datos para impedir que otros usuarios modifiquen los datos de tal forma que el usuario actual resulte afectado. En un modelo pesimista, cuando un usuario realiza una acción que hace que se aplique un bloqueo, otros usuarios no pueden realizar acciones que entrarían en conflicto con el bloqueo hasta que el propietario del bloqueo lo libere. Este modelo se utiliza principalmente en aquellos entornos en los que hay mucha contención de datos, de manera que el costo de proteger los datos con bloqueos es menor que el costo de deshacer transacciones si se producen conflictos de concurrencia. Por tanto, en un modelo de concurrencia pesimista, un usuario que actualiza una fila establece un bloqueo. Hasta que el usuario no haya terminado la actualización y liberado el bloqueo, nadie más podrá modificar dicha fila. Por este motivo, la concurrencia pesimista resulta más adecuada cuando los tiempos de bloqueo son cortos, como ocurre en el procesamiento de registros mediante programación. La concurrencia pesimista no es una opción escalable cuando los usuarios interactúan con los datos y hacen que los registros queden bloqueados durante períodos de tiempo relativamente largos. Por el contrario, los usuarios que utilizan la concurrencia optimista no bloquean una fila cuando la leen. Cuando un usuario desea actualizar una fila, la aplicación debe determinar si otro usuario la ha modificado o no desde que se leyó. La concurrencia optimista suele utilizarse en entornos con poca contención de datos. Esto mejora el rendimiento porque no es necesario bloquear registros, a la vez que el bloqueo de registros requiere recursos adicionales del servidor. Además, para mantener bloqueos de registros es necesaria una conexión persistente con el servidor de base de datos. Como éste no es el caso en un modelo de concurrencia optimista, las conexiones con el servidor pueden atender a un mayor número de clientes en menos tiempo. . el Usuario1 encuentra una infracción de la concurrencia optimista porque los valores de la base de datos ("Jaime") ya no coinciden con los valores originales que esperaba el Usuario1 ("Cris"). el Usuario1 lee una fila de la base de datos con los valores siguientes: IdCliente 101 Apellido Nombre Cris Valor original Valor actual Valor en la base de datos 101 101 101 Martínez Martínez Martínez Cris Cris Cris Martínez Nombre de columna IdCliente Apellido Nombre A la 1:01 p. el Usuario1 cambia el nombre de "Cris" a "Jaime" e intenta actualizar la fila.En un modelo de concurrencia optimista. Ahora hay que tomar la decisión de sobrescribir los cambios . Nombre de columna IdCliente Apellido Nombre Valor original Valor actual Valor en la base de datos 101 101 101 Martínez Martínez Martínez Cris Jaime Cristina En este momento. Las siguientes tablas muestran un ejemplo de concurrencia optimista.. Nombre de columna IdCliente Apellido Nombre Valor original Valor actual Valor en la base de datos 101 101 101 Martínez Martínez Martínez Cris Cristina Cris La actualización se realiza correctamente porque los valores contenidos en la base de datos en el momento de la actualización coinciden con los valores originales que tiene el Usuario2. A la 1:05 p.m.m. el Usuario2 lee la misma fila.m. A la 1:00 p. A la 1:03 p. el Usuario2 cambia Nombre de "Cris" a "Cristina" y actualiza la base de datos. después de que un usuario recibe un valor de la base de datos. se considera que ha habido una infracción si..m. otro usuario modifica el valor antes de que el primer usuario haya intentado modificarlo. En el ejemplo siguiente se describe cómo el servidor resuelve una violación de concurrencia .. Se recomienda devolver siempre un valor de clave principal único en la consulta. Por ejemplo. Al hacer una prueba para ver si hay infracciones de la concurrencia optimista. Si no coinciden. se utilizaría la siguiente instrucción UPDATE: UPDATE Table1 Set Col1 = @NewCol1Value. Las bases de datos suelen ofrecer funcionalidad de marca de tiempo que puede utilizarse para identificar la fecha y la hora en que se actualizó el registro por última vez. Probar si hay infracciones de la concurrencia optimista Existen varias técnicas para probar si se ha producido una infracción de la concurrencia optimista. se realiza la actualización y se actualiza la columna de marca de tiempo con la hora actual con el fin de reflejar la actualización. Set Col2 = @NewCol2Value. Col3 FROM Table1 Para probar si hay alguna infracción relacionada con la concurrencia optimista al actualizar una fila de Tabla1. la instrucción UPDATE anterior puede actualizar más de una fila. se ha producido una infracción de la concurrencia optimista. Si coinciden. Set Col3 = @NewCol3Value WHERE Col1 = @OldCol1Value AND Col2 = @OldCol2Value AND Col3 = @OldCol3Value La actualización se realizará siempre y cuando los valores originales coincidan con los valores de la base de datos. observe la siguiente consulta: SELECT Col1. Otra técnica para probar si hay alguna infracción relacionada con la concurrencia optimista consiste en comprobar que todos los valores de columna originales de una fila siguen coincidiendo con los existentes en la base de datos. lo que quizás no sea su intención. se compara el valor de marca de tiempo de la base de datos con el valor de marca de tiempo original contenido en la fila modificada. Una de ellas consiste en incluir una columna de marca de tiempo en la tabla. Mediante esta técnica se incluye una columna de marca de tiempo en la definición de la tabla. Si se ha modificado algún valor. Cuando se intenta realizar una actualización. la actualización no modificará la fila porque la cláusula WHERE no encontrará ninguna coincidencia. la columna de marca de tiempo se devuelve con cualquier consulta del contenido de la tabla. Col2. De lo contrario. . se actualiza la marca de tiempo de manera que queden reflejadas la fecha y la hora actuales.realizados por el Usuario2 con los efectuados por el Usuario1 o cancelar los cambios del Usuario1. Siempre que se actualiza el registro. Si se establece que el comando de actualización compruebe la concurrencia optimista. quizás sea necesario extender la cláusula WHERE para comprobar si hay alguna referencia nula coincidente en la tabla local y en el origen de datos. como UpdateStatus. UPDATE Table1 Set Col1 = @NewVal1 WHERE (@OldVal1 IS NULL AND Col1 IS NULL) OR Col1 = @OldVal1 También se puede decidir la aplicación de criterios menos restrictivos al utilizar un modelo de concurrencia optimista. etc. incluyendo el procesamiento cuando se produce una excepción. la siguiente instrucción UPDATE comprueba que una referencia nula de la fila local sigue coincidiendo con una referencia nula del origen de datos o que el valor de la fila local sigue coincidiendo con el valor del origen de datos. agregar lógica de reintento.Si una columna del origen de datos admite valores nulos.SkipCurrentRow. Evento DataAdapter.ContinueUpdateOnError como true antes de llamar a Update y responder a la información de error almacenada en la propiedad RowError de una fila determinada cuando Update termine. agregar información de error personalizada. si sólo se utilizan las columnas de clave principal en la cláusula WHERE se sobrescribirán los datos. utiliza el evento RowUpdated para probar si hay infracciones relacionadas con la concurrencia optimista. El evento RowUpdated le permite controlar este caso y evitar la excepción al establecer un valor RowUpdatedEventArgs. la propiedad RecordsAffected devolverá un valor 0 cuando se haya producido una infracción en la concurrencia optimista. RowUpdated se produce después de cada intento de actualizar una fila Modified de un DataSet. En tal caso se inicia una excepción. Para obtener más información.RowUpdated El evento RowUpdated del objeto DataAdapter puede utilizarse junto con las técnicas descritas anteriormente para informar a la aplicación de las infracciones de la concurrencia optimista. Por ejemplo. a continuación. lo que hará que se sobrescriban los datos a menos que se hayan actualizado ciertos campos desde que se consultaron por última vez. la aplicación establece el . ya que no se actualizó ningún registro. Cuando se encuentra una infracción de la concurrencia optimista.Status apropiado. consulte Trabajar con eventos DataAdapter. Para obtener más información sobre el evento RowUpdated. Esto permite agregar código especial de control. El objeto RowUpdatedEventArgs devuelve una propiedad RecordsAffected con el número de filas afectadas por un determinado comando de actualización para una fila modificada de una tabla. De forma opcional. vea Agregar y leer información de error de fila. Ejemplo de concurrencia optimista A continuación se muestra un ejemplo sencillo que establece UpdateCommand de DataAdapter para probar la concurrencia optimista y. También se puede aplicar una cláusula WHERE sólo a determinadas columnas. es posible establecer DataAdapter. independientemente de que las otras columnas se hayan actualizado o no desde la última consulta. Por ejemplo. Original. // The Update command checks for optimistic concurrency violations // in the WHERE clause. Hay que tener en cuenta que los valores de los parámetros pasados a la cláusula WHERE del comando UPDATE se asignan a los valores Original de sus respectivas columnas. parameter. C# VB // Assumes connection is a valid SqlConnection. // Add the RowUpdated event handler. CompanyName FROM Customers ORDER BY CustomerID".Status = UpdateStatus. connection).Add( "@oldCompanyName". "Customers"). // Modify the DataSet contents. adapter. foreach (DataRow dataRow in dataSet. "CompanyName").UpdateCommand. adapter. adapter. SqlRowUpdatedEventArgs args) { if (args. 5.Original. connection).NVarChar. 30.UpdateCommand = new SqlCommand("UPDATE Customers " + (CustomerID.Rows) { if (dataRow.WriteLine(dataRow [0] + "\n" + dataRow.RecordsAffected == 0) { args. parameter.SourceVersion = DataRowVersion.Tables["Customers"].SkipCurrentRow. SqlDbType.Parameters. adapter. SqlDbType.Fill(dataSet.HasErrors) Console. } protected static void OnRowUpdated(object sender. SqlParameter parameter = adapter.SourceVersion = DataRowVersion. 5. 30. DataSet dataSet = new DataSet(). parameter = adapter.UpdateCommand.Parameters.Add( "@CustomerID". @CompanyName) " + "WHERE CustomerID = @oldCustomerID AND CompanyName = " + @oldCompanyName". args. "Customers"). adapter. CompanyName) VALUES(@CustomerID.RowUpdated += new SqlRowUpdatedEventHandler(OnRowUpdated).UpdateCommand. "CustomerID").Add( "@oldCustomerID". "CustomerID").Row. "CompanyName"). // Pass the original values to the WHERE clause parameters. SqlDataAdapter adapter = new SqlDataAdapter( "SELECT CustomerID.Parameters. adapter. SqlDbType.RowError = "Optimistic Concurrency Violation Encountered".RowError de la fila para la que se emitió la actualización con el fin de reflejar la existencia de una infracción de la concurrencia optimista.RowError).Parameters.NVarChar.Add( "@CompanyName". .UpdateCommand.NChar. SqlDbType.Update(dataSet.NChar. } } .
Copyright © 2024 DOKUMEN.SITE Inc.