| |||
Concurrencia en sql server Hola a todos,mi duda es la siguiente, estoy trabajando con sql server 2005 y queria sabar si este gestor trabaja internamente con algun tipo de concurrencia (optimista,pesimista,...) y si se puede configurar con el tipo de concurrencia que quieres que trabaje.O esto de la concurrencia lo hay que controlar desde el programa que se conecta a la BBDD????
__________________ Inmuebles de Galicia:www.inmueblevirtual.net Compartir piso en Galicia:www.inmueblevirtual.net/foro |
| |||
Re: Concurrencia en sql server Esto lo conteste en otro foro; pero aca lo explico de nuevo para que todos los que no tienen claro esto que es por lo demas muy complejo, se hagan de una idea El control de la concurrencia se programa usando las transacciones SQL; las cuales son una o varias sentencias sql que se ejecutan como una sola LUW (unidad logica de trabajo) El control de transacciones concurrentes en una base de datos brinda un eficiente desempeño en un Motor de Datos, puesto que permite controlar la ejecución de transacciones que operan en paralelo, accesando a información compartida y, por lo tanto, interfiriendo potencialmente unas con otras... Junto con la programacion transaccional es recomendable a veces cambiar el bloqueo (tipo de acceso que se permite a un elemento) .... el defecto es nivel de pagina ; por lo que cambiarlo a nivel de Row ayudaria bastante (esto ultimo depende del motor que estas usando; ya que no todos permiten a nivel de fila). Ahora voy a poner un ejemplo de una transaccion en un procedimiento almacenado para que se hagan de una idea de que significa trabajar con aplicaciones sql que manejen la concurrencia... la clave es el BEGIN TRAN ... COMMIT o ROLLBACK END TRAN create procedure spa_adp_eli_anotaciones ( @cd_empresa smallint, @id_proyecto int, @fc_anotacion datetime) AS BEGIN TRAN declare @error int, @msg varchar(255) -- Elimina Anotacion delete from SGC_ANOTACIONES where cd_empresa = @cd_empresa and id_proyecto = @id_proyecto and fc_anotacion = @fc_anotacion select @error=@@error if @error != 0 begin select @msg = "*** ERROR AL ELIMINAR ANOTACION ***" goto fin end -- Commit de transaccion commit tran select 0 RETORNO, @msg MSG return -- Subrutinas fin: rollback tran select -1 RETORNO, @msg MSG return go Espero les ayude En el ejemplo puse solo un delete; pero la idea es agrupar varias sentencias que pueden ser select, insert, delete, etc... y siempre controlando el exito o fracaso de ellas .. si todo exitoso entonces se hace COMMIT que indica que se grabara la información en las tablas; si falla ROLLBACK y devuelve todo ... con esto se logra el control perfecto de la integridad que es muy pero muy importante Saludos |